当函数参数通过引用传递时,为什么对该参数调用复制构造函数
Why is the copy constructor called on a function argument when the argument is passed by reference?
我在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/
相关文章:
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 在C++中传递给函数时,为什么要指定数组大小作为参数
- 为什么 std::function 可以作为 std::not2 的参数?
- 当给定默认值时,为什么此模板参数推导失败
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 为什么默认复制函数在按值发送参数时不调用?
- 为什么 std::绑定错误参数可以成功?
- 模板参数列表中的 false 在模板初始化期间计算为什么?
- 为什么我们不能重复使用具有不同模板参数的别名模板标识符?
- 为什么模板参数推导失败?
- 为什么我需要在成员发起器列表中重复基类的模板参数?
- 为什么我不能将引用作为 std::async 的函数参数传递
- 为什么可变参数函数不适用于模板
- 为什么即使我调用参数化构造函数也会调用默认构造函数?
- 为什么这个噪声函数不处理否定参数?
- 不可能:此指针作为默认参数.为什么
- 默认模板参数:为什么编译器抱怨没有指定模板参数
- C++数组作为参数 - 为什么只需要指定"outer"维度
- 函数重载std::函数参数:为什么从未调用const方法
- 使用 std::enable_if 作为 templ 时的默认模板参数.参数:为什么可以使用两个仅在enable_if参