#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;
}

为了测试在使用复制初始化时是调用复制构造函数还是构造函数,我将复制构造函数设为私有(private)。尽管它可与Visual c++ 2005一起使用,但代码块13.12(使用C++ 11标准进行编译)会产生错误。

当我按原样运行时,它会给出:
Constructor

Constructor

作为输入。

我是否正确,是否认为var(2)var2=2具有相同的含义,而却都调用了相同的构造函数?

如果是,为什么代码块给出错误?由于它不使用copy-constructor,因此不应给出错误。

最佳答案

这个...

ExClass var2=2;

相当于这个
ExClass var2 = ExClass(2);

...名义上调用了copy-constructor,但是该标准有一个特殊规定,允许将其省略为var2的直接构造。这是编译器可以选择执行的可选优化-仅当编译器不遗漏时,复制构造函数的缺失定义才有意义。无论哪种方式,编译器都必须检查复制构造是否合法操作(例如,不删除它)。

因此,两个编译器都是正确的,并且实际上同一个编译器可能会因调用命令行优化标志而出错或不出错。

09-25 22:55