#include <iostream>
using namespace std;
class ExClass
{
int data;
ExClass(const ExClass&);
public:
ExClass() : data(0) {}
ExClass(int d) : data(d) { cout<<"Constructor"<<endl; }
};
int main()
{
ExClass var(2);
ExClass var2=2;
return 0;
}
为了测试在使用复制初始化时它是否调用了copy-constructor或构造函数,我将copy-constructor设为private。虽然它适用于visual c ++ 2005,但是代码块13.12(使用C ++ 11标准进行编译)会产生错误。
当我按原样运行它时,它会给出:
Constructor
Constructor
作为输入。
我是否正确认为这意味着var(2)
和var2=2
具有相同的含义,它们都会调用相同的构造函数?
如果是,为什么代码块会出错?由于它不使用copy-constructor,因此不应该出错。
答案 0 :(得分:2)
这......
ExClass var2=2;
......相当于......
ExClass var2 = ExClass(2);
......名义上调用了复制构造函数,但是标准有一个特殊条款允许将其省略为var2
的直接构造。这是编译器可以选择执行的可选优化 - 只有如果,编译器不会忽略复制构造函数的缺失定义。无论哪种方式,编译器必须检查复制构造是否合法操作(例如,它不被删除)。
因此,两个编译器都是正确的,实际上相同的编译器可能会收到错误,具体取决于它调用的命令行优化标志。
答案 1 :(得分:1)
ExClass var2 = 2;
将2
转换为ExClass
临时(prvalue),然后使用该prvalue初始化var2
。第二步涉及移动或复制构造函数(通常)。可以省略对该复制/移动构造函数的调用,但它必须是可能的/有效的。 (如果省略了呼叫,则复制/移动ctor不会使用,因此无需定义。)
Standardese可在[dcl.init] / 17和[class.copy] / 31ff
中找到