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
另一个编译器对此转换感到满意。真相在哪里?我应该如何定义一个,以便我得到一个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. 复制初始化此处。
相关文章:
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- enable_if转换构造函数(静态强制转换,is_base_of)
- 为什么我需要在转换构造函数上引用 this->?
- 为什么在使用转换构造函数编译代码时需要 const 复制构造函数?
- 为什么不对转换构造函数进行隐式强制转换?
- 转换构造函数和运算符都存在且涉及显式性时的行为
- C++ 03 类模板 这是转换构造函数还是转换运算符?以及如何声明解决此问题的方法
- 使用完美转发的模板转换构造函数
- 转换构造函数的参数可以隐式转换吗?
- std::变量转换构造函数行为
- 隐式用户定义的转换不起作用,因为在编译C 时无法识别运算符和转换构造函数
- 为什么不调用模板类中的转换构造函数?
- 转换构造函数的隐式参数
- 转换构造函数:您如何解释C 中给定不同参数的函数
- C++变体:为什么转换构造函数需要大小.(类型)为非零
- C++变体用bool转换构造函数
- 在重载解析期间调用转换运算符,而不是在 c++17 中转换构造函数
- 为什么在没有赋值运算符的情况下调用转换构造函数
- 如何将转换构造函数与指针一起使用?
- 为什么在调用隐式类型转换构造函数之后直接是驱动器