C ++构造函数隐式转换没有发生

时间:2014-01-31 22:23:15

标签: c++ constructor implicit-conversion

我定义了一个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;工作

2 个答案:

答案 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;正常工作,您必须使复制(或移动)构造函数可访问 - 这基本上意味着将其公开。