即使从未调用复制CTOR也需要吗?

dan*_*man 8 c++ access-modifiers copy-constructor

考虑以下:

class X {
public:
    X(int i) { cout << "X(int i)" << endl; }
    X(const X& x) { cout << "X(const X& x)" << endl; }
};

void main() {
    X x1(1);
    X x2 = X(1);
    X x3 = (X)1;
}
Run Code Online (Sandbox Code Playgroud)

运行此代码会产生以下输出:

X(int i)
X(int i)
X(int i)
Run Code Online (Sandbox Code Playgroud)

我认为以上所有三个语句都是等价的,因为从未调用CTOR副本.但是,将X复制CTOR更改为私有:

class X {
public:
    X(int i) { cout << "X(int i)" << endl; }
private:
    X(const X& x) { cout << "X(const X& x)" << endl; }
};
Run Code Online (Sandbox Code Playgroud)

将无法编译(在Visual Studio 2010中)此错误:

cannot access private member declared in class 'X'
Run Code Online (Sandbox Code Playgroud)

所以似乎复制CTOR在某种程度上涉及到虽然我不太明白如何.

谢谢

Naw*_*waz 5

X x1(1);
X x2 = X(1);
X x3 = (X)1;
Run Code Online (Sandbox Code Playgroud)

原因是所有这些都不完全相同.

第一个是直接初始化,第二个和第三个是复制初始化.对于复制初始化,复制构造函数必须是公共的,否则编译器将给出错误.

现在的问题是,如果第二个和第三个要求copy-ctor是公开的,那么为什么输出如下:

X(int i)
X(int i)
X(int i)
Run Code Online (Sandbox Code Playgroud)

这肯定会说copy-ctor永远不会被称为是真的.编译器刚刚调用了copy-ctor.根据§8.5/ 14,在这种情况下,允许编译器不需要调用copy-constructor.这就是为什么你没有看到copy-ctor被调用的原因.

一点点内部:在第二和第三种情况下,首先通过调用创建临时X(int i),然后将此临时文件传递给copy-ctor以复制初始化正在声明的对象.但编译器优化了这一步骤,忽略了对copy-ctor的调用.