C 构造函数隐式转换不会发生

C++ constructor implicit conversion not happening

本文关键字:转换 构造函数      更新时间:2023-10-16

我定义了一个类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

另一个编译器对此转换感到满意。真相在哪里?我应该如何定义一个,以便我得到一个mya = 7;工作?

gcc是正确的。A myA(7);直接初始化 - 它使用int参数的构造函数初始化myA

A myA = 7;复制初始化 - 它使用 int构造函数初始化临时A对象,然后使用复制构造器从此临时性初始化myA。即使该副本很可能在实践中被阐明,但它仍然必须是合法的。和sinec副本构造函数无法访问,它失败了。

要使A myA = 7;起作用,您必须使副本(或移动)构造函数可访问 - 这基本上意味着公开。

g 对此是正确的。问题是

A myA = 7;

是A 复制初始化,这意味着,从语义上讲,您对RHS上的A进行了隐式转换,然后是复制构造。可以将实际的副本放大,但必须可以访问复制构造函数。

另一方面,

A myA(7);

直接初始化。这仅需要转换构造函数A(int)

更多关于直接初始化 vs. 复制初始化此处。