[英]C++ constructor implicit conversion not happening
我定义了一个A类
class A{
public:
A(int){}
private:
A(const A&);
A& operator=(const A&);
};
我认为,因为我从int给出一个构造函数,所以隐式构造被授予......无论如何
A myA(7);
工作得很好,g ++给了我这一行:
A myA = 7;
以下错误:
Test02.cpp: In function ‘int main(int, char**)’:
Test02.cpp:5:3: error: ‘A::A(const A&)’ is private
Test02.cpp:12:12: error: within this context
另一个编译器对此转换感到满意。 真相在哪里? 我应该如何定义A以便得到A myA = 7; 工作?
g ++是对的。 问题是
A myA = 7;
是复制初始化这意味着,在语义上,您在RHS上有一个隐式转换为A
,然后是复制构造。 可以省略实际副本,但仍必须可以访问复制构造函数。
另一方面,
A myA(7);
是直接初始化 。 这只需要转换构造函数A(int)
。
更多关于直接初始化与拷贝初始化 这里 。
GCC是对的。 A myA(7);
是直接初始化 - 它使用带有int
参数的构造函数初始化myA
。
A myA = 7;
是复制初始化 - 它使用int
构造函数初始化一个临时A
对象,然后使用复制构造函数从此临时文件初始化myA
。 虽然副本很可能在实践中被省略,但它仍然必须是合法的。 并且sinec复制构造函数不可访问,它失败。
使A myA = 7;
工作,你必须使复制(或移动)构造函数可访问 - 这基本上意味着将其公开。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.