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

Why is the copy constructor called on a function argument when the argument is passed by reference?

本文关键字:参数 为什么 复制 构造函数 调用 函数 引用      更新时间:2023-10-16

我在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时会调用复制构造函数?既然line是通过引用传递的,那么func不是只在其本地堆栈上保留对line的引用吗?

在输入时,从line 初始化func的单个参数

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

那个例子不太正确。正如您已经注意到的,函数参数是通过const引用传递的,并且不涉及转换,因此不涉及复制构造函数。另一方面,结果可能是从返回值调用复制构造函数到向量v,这取决于函数的声明方式。如今,大多数编译器都实现了RVO和NRVO,它们被允许进行标准优化,从而避开了复制构造。点击此处阅读更多信息:

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