复制初始化时复制构造函数或构造函数是否有效

时间:2014-09-30 12:42:52

标签: c++ constructor

#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,因此不应该出错。

2 个答案:

答案 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

中找到