我正在阅读直接初始化和复制初始化之间的区别(§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),提示:
到目前为止一切顺利,再次确认了Herb Sutter的说法,prog.cpp:8: error: ‘A::A(const A&)’ is private
复制初始化意味着在使用复制构造函数进行初始化之前,首先调用必要的用户定义转换,并等价于形式"T t = u;":
接下来,我通过注释“private”关键字使copy-ctor可访问。现在,自然而然地期望将打印以下内容:
但令我惊讶的是,它实际上打印了以下内容(ideone):A(const A&)
为什么?A(int i)
好吧,我明白了,首先使用`A(int i)`从`10`(int类型)创建了一个临时对象A,按照需要应用转换规则(§8.5/14),然后它应该调用复制构造函数来初始化a。但是它没有。为什么?
如果实现允许消除调用复制构造函数的需要(§8.5/14),那么为什么当复制构造函数被声明为private时它不接受代码?毕竟,它没有调用它。这就像一个调皮捣蛋的孩子先是烦人地要求一个“特定”的玩具,当你给他一个“特定”的玩具时,他在你背后把它扔掉了。:|
这种行为可能危险吗?我的意思是,我可能会在复制构造函数中做一些其他“有用”的事情,但如果它不调用它,它是否不改变程序的行为?