繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM