我定义了一个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;工作
答案 0 :(得分:3)
g ++是对的。问题在于
A myA = 7;
是复制初始化这意味着,在语义上,您在RHS上隐式转换为A
,然后是复制构造。可以省略实际的副本,但仍然可以访问复制构造函数。
另一方面,
A myA(7);
是直接初始化。这只需要转换构造函数A(int)
。
有关直接初始化与复制初始化 here的更多信息。
答案 1 :(得分:3)
A myA(7);
是直接初始化 - 它使用构造函数使用myA
参数初始化int
。
A myA = 7;
是复制初始化 - 它使用A
构造函数初始化一个临时int
对象,然后使用此临时值初始化myA
复制构造函数。虽然副本很可能在实践中被省略,但它仍然必须是合法的。并且sinec复制构造函数不可访问,它失败。
要使A myA = 7;
正常工作,您必须使复制(或移动)构造函数可访问 - 这基本上意味着将其公开。