2017-02-13 37 views
1

在这本书由安德鲁·柯尼希,加速C++,他给出了下面的代码:关于传递一个临时对象const引用

vector<double> emptyvec() 
{ 
    vector<double> v; // no elements 
    return v; 
} 

grade(midterm, final, emptyvec()); 

现在,高档功能需要一个常量引用vector<double>。这对我来说意味着emptyvec()返回的临时对象应该被复制,因为它是作为局部变量在栈中创建的,并且对我而言似乎很陌生。这是如何工作的?在另一页上,他将一个const引用传递给一个函数,该函数根据值取其参数并修改它们。是否可以将vector<double>的const引用传递给参数期望为vector<double>的函数?

+0

什么让你认为通过引用传递的向量应该被复制? (你的第二个问题应该是第二个问题,并带有适当的代码示例。) –

+0

其实,我有点困惑。该矢量可能是通过矢量构造函数在堆中初始化的,对吧?通过返回值而不是引用,毕竟'emptyvec'返回一个不是引用的向量,v的值应该被复制到等级参数中,这就是我的看法。 – meguli

+0

你说的“等级函数需要一个const引用”,但在你的最后一句话中,你说“函数的参数期望向量” –

回答

2

这意味着对我来说,因为它是在堆栈中创建为一个局部变量

当然,它不被复制由emptyvec()返回的临时对象应该被复制。但是,它被复制到的位置由编译器指定,而不是由您的程序指定。

如果不是因为编译器通过一个临时的恒定基准能力,你将不得不这样做:

vector<double> tmp(emptyvec()); 
grade(midterm, final, tmp); 

这几乎是什么幕后的代码恰好从书,但代码无法访问tmp变量。

vector<double>的常量引用是否可以传递给参数期望的函数vector<double>

是的,只要参数是按值传递的,而不是通过引用。回想一下,复制构造函数需要const引用。当您调用一个需要vector<double>并将const vector<double>&传递给它的函数时,C++调用vector<double>的构造函数,传递一个常量引用,并在函数内部使用结果副本。

+0

如果函数需要'const vector &'而我通过它'vector '会怎么样?我们是否仍然调用复制构造函数? – meguli

+0

@meguli如果该函数采用const引用,则在调用期间不会有复制构造函数调用。 – dasblinkenlight

2

现在,等级函数对矢量采用常量引用。这意味着,我认为)由emptyvec(返回的临时对象应该被复制

grade接受const引用由emptyvec返回的对象是否被复制或不不影响的事实。

这是如何工作的?

如果你通过值返回一个局部变量,那么你在概念上做一个局部变量的拷贝(或者从C++ 11开始的一个动作)。

但是,C++标准允许复制(和移动)被“消除”。在实践中,优化器可以选择构建返回的对象,并将其原本复制到的地方。这被称为“(命名)返回值优化”。

另外在另一页上,他将一个const引用传递给一个函数,该函数根据值取其参数并修改它们。可以将一个向量的const引用传递给一个参数期望向量的函数吗?

使用相同类型的(const)引用初始化对象将调用复制构造函数。该函数的参数将是被引用的对象的副本。