类型t = Type()是否调用复制构造函数?

时间:2013-11-23 04:02:07

标签: c++ visual-c++ initialization copy-constructor

我真的很困惑.... Type t = Type()是否会调用复制构造函数?

我问,因为当我尝试:

#include <iostream>

class Test
{
public:
    Test(Test const &) { std::cout << "hello"; }
    Test() { }
};

int main()
{
    Test t = Test();
    return 0;
}

没有输出,但是当我将其更改为

#include <iostream>

class Test
{
    Test(Test const &) { std::cout << "hello"; }
public:
    Test() { }
};

int main()
{
    Test t = Test();
    return 0;
}

我明白了:

error C2248: 'Test::Test' : cannot access private member declared in class 'Test'

这没有意义(特别是因为这是一个调试版本)。

更新

即便这样编译!

struct Test
{
    Test(Test &&) = delete;
    Test(Test const &) = delete;
    Test() { }
};

int main()
{
    Test t = Test();
    return 0;
}

复制/移动构造函数是必需还是否?

1 个答案:

答案 0 :(得分:3)

来自维基百科:

  

在C ++计算机编程中,copy elision指的是编译器   消除不必要的对象复制的优化技术。   C ++语言标准通常允许实现执行   任何优化,提供结果程序的可观察行为   如果,即假装,程序是完全执行的是相同的   按照标准的要求。

     

该标准还描述了一些可以进行复制的情况   即使这会最大程度地改变程序的行为也会被淘汰   常见的是返回值优化。另一个广泛实施   在C ++标准中描述的优化是暂时的   类类型的对象被复制到相同类型的对象。[1]的作为   结果,复制初始化通常相当于   在性能方面直接初始化,但在语义方面没有;   复制初始化仍需要可访问的副本   构造即可。[2]优化不能应用于临时   已绑定到引用的对象。

您正在进行复制构建,但该标准允许将其转换为直接初始化,并且无论调试是否已关闭,这都是完成的,这就是打印未到达的原因。

但是,因为它“应该”是一个复制结构,你需要访问一个,这就是第二个代码无效的原因。