首页 > 解决方案 > 拷贝初始化和拷贝构造函数的关系

问题描述

#include <iostream>

class Test {
public:
    Test(const int& i) 
    {
        std::cout << "Direct" << std::endl;
    }
    Test(const Test& t) 
    {
        std::cout << "Copy" << std::endl;
    }
};

int main()
{
    Test test = 1;
    return 0;
}

该程序(用 C++11 编译)只会输出Direct,但Test test = 1;意味着隐式将 1 转换为 Test 然后将结果复制到test,我希望它同时输出DirectCopy,有人可以解释一下吗?

标签: c++

解决方案


直到 c++17,这个初始化:

Test test = 1;

Test将从1创建一个临时int对象,然后为test. 在实践中,编译器会进行复制省略,而临时的将被省略。您可以通过传递标志来强制编译器不进行省略-fno-elide-constructors,以查看两个构造函数调用。

从c++17开始,写法变了,右手边根本就没有临时的,所以没有什么可以省略的,只调用了一个构造函数。因此,即使您使用-fno-elide-constructors,您也只会看到一个构造函数调用。


推荐阅读