当参数通过引用传递时,为什么复制构造函数调用函数参数?

时间:2011-10-06 23:20:19

标签: c++

我从Accelerated C ++中看到了这个例子

vector<string> func(const string&); //function declaration

vector<string> v;
string line = "abc";

v = func(line); //on entry, initialization of func's single parameter from line
         //on exit, both initialization of the return value and then assignment to v

我的问题是,因为func将const字符串引用作为参数,为什么在输入func时调用了复制构造函数?由于行是通过引用传递的,因此func只是在其本地堆栈上保留对行的引用吗?

2 个答案:

答案 0 :(得分:5)

  

进入时,从func

初始化line的单个参数

func的参数 是从line初始化的,但它不是string,而是对它的引用。它的初始化不会导致对复制构造函数的调用,但它会使参数成为line的别名(就像初始化引用一样)。

答案 1 :(得分:1)

这个例子不太对劲。正如您已经注意到的那样,函数参数由const引用传递,并且不涉及转换,因此不涉及复制构造函数。另一方面,结果可能是从返回值向向量v调用复制构造函数,具体取决于函数的声明方式。如今大多数编译器都实现了RVO和NRVO,允许标准优化,避免复制构造。在这里阅读更多相关信息:

http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/