我真的很困惑.... 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;
}
复制/移动构造函数是必需还是否?
答案 0 :(得分:3)
来自维基百科:
在C ++计算机编程中,copy elision指的是编译器 消除不必要的对象复制的优化技术。 C ++语言标准通常允许实现执行 任何优化,提供结果程序的可观察行为 如果,即假装,程序是完全执行的是相同的 按照标准的要求。
该标准还描述了一些可以进行复制的情况 即使这会最大程度地改变程序的行为也会被淘汰 常见的是返回值优化。另一个广泛实施 在C ++标准中描述的优化是暂时的 类类型的对象被复制到相同类型的对象。[1]的作为 结果,复制初始化通常相当于 在性能方面直接初始化,但在语义方面没有; 复制初始化仍需要可访问的副本 构造即可。[2]优化不能应用于临时 已绑定到引用的对象。
您正在进行复制构建,但该标准允许将其转换为直接初始化,并且无论调试是否已关闭,这都是完成的,这就是打印未到达的原因。
但是,因为它“应该”是一个复制结构,你需要访问一个,这就是第二个代码无效的原因。