我正在阅读直接初始化和复制初始化之间的区别(第 8.5/12 节):
T x(a); //direct-initialization
T y = a; //copy-initialization
我从阅读有关复制初始化的内容中了解到,它需要可访问且非显式的复制构造函数,否则程序将无法编译。我通过编写以下代码来验证它:
struct A
{
int i;
A(int i) : i(i) { std::cout << " A(int i)" << std::endl; }
private:
A(const A &a) { std::cout << " A(const A &)" << std::endl; }
};
int main() {
A a = 10; //error - copy-ctor is private!
}
GCC 给出一个错误(ideone)说:
prog.cpp:8: 错误: 'A::A(const A&)' 是私有的
到目前为止一切都很好,重申 Herb Sutter 所说的话,
复制初始化是指使用复制构造函数对对象进行初始化,必要时先调用用户定义的转换,等价于“T t = u;”的形式:
之后,我通过注释private
关键字使 copy-ctor 可访问。现在,我自然希望打印以下内容:
A(常量 A&)
但令我惊讶的是,它改为打印(ideone):
A(int i)
为什么?
好吧,我知道首先A
创建10
一个类型的临时对象int
,通过使用A(int i)
,在此处根据需要应用转换规则(第 8.5/14 节),然后它应该调用 copy-ctor 来初始化a
。但它没有。为什么?
如果允许实现消除调用复制构造函数的需要(第 8.5/14 节),那么为什么在声明复制构造函数时它不接受代码private
?毕竟,它没有调用它。这就像一个被宠坏的孩子,他先恼火地要一个特定的玩具,当你给他一个,那个特定的玩具,他就把它扔在你背后。:|
这种行为会不会很危险?我的意思是,我可能会在 copy-ctor 中做一些其他有用的事情,但如果它不调用它,那么它不会改变程序的行为吗?