为什么这里不调用复制构造函数

Why copy constructor is not called here?

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

对于以下代码:

    #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

已正确调用复制构造函数。