为什么这里不调用复制构造函数
Why copy constructor is not called here?
对于以下代码:
#include<iostream>
using namespace std;
class Test
{
public:
Test(const Test &t) { cout<<"Copy constructor called"<<endl;}
Test() { cout<<"Constructor called"<<endl;}
};
Test fun()
{
cout << "fun() Calledn";
Test t;
return t;
}
int main()
{
Test t1;
Test t2 = fun();
return 0;
}
我真的很困惑何时调用复制构造函数?就像我正在运行上面的程序复制构造函数一样,没有调用。这意味着如果我弄乱了传递给复制构造函数的参数(消除 const 关键字),它不应该显示任何编译器错误。但它的表现
"调用'测试::测试(测试)'没有匹配函数"
此外,fun() 返回一个类型测试的对象,它是在 fun() 执行期间创建的。为什么这里不调用复制构造函数?
int main()
{
fun();
return 0;
}
另外,如果我对主函数进行以下更改,为什么只调用一次复制构造函数,而不是两次?
int main()
{
Test t2 = fun();
Test t3 = t2;
return 0;
}
这是因为
由于编译器中启用了 NRVO,因此此处使用了复制初始化,而不是复制构造函数。您应该指定
-fno-elide-constructors
海湾合作委员会标志
C++ 标准允许实现省略创建临时 仅用于初始化相同类型的另一个对象。 指定此选项将禁用该优化,并强制 G++ 在所有情况下都调用复制构造函数。
或在VS上使用cl /Od program.cpp
编译它(/O1和/O2启用NRVO)
C++:避免使用"return"语句复制
当我在VS2010中运行您的代码时,我得到了正确的结果:
1.
Constructor called
fun() Called
Constructor called
Copy constructor called
阿拉伯数字。
fun() Called
Constructor called
Copy constructor called
3.
fun() Called
Constructor called
Copy constructor called
Copy constructor called
已正确调用复制构造函数。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 复制构造函数、赋值运算符C++
- std::ofstream 作为类成员删除复制构造函数?
- 复制构造函数C++无法正确复制指针
- 关于复制构造函数的一个棘手问题
- 为什么调用复制构造函数而不是移动构造函数?
- 填充上编译器生成的复制构造函数之间的不一致
- C++ 对象指针数组的复制构造函数
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 防止在复制构造函数中隐式调用基构造函数
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 具有已删除移动和复制构造函数的类的就地构造
- 复制构造函数隐式转换问题
- 复制构造函数中的递归调用