隐式复制构造函数

For*_*veR 6 c++ copy-constructor implicit-conversion c++11

引自n3337 12.3.1/3

非显式复制/移动构造函数(12.8)是转换构造函数.隐式声明的复制/移动构造函数不是显式构造函数; 可以调用它来进行隐式类型转换.

引自ANSI ISO IEC 14882 2003

非显式复制构造函数(12.8)是转换构造函数.隐式声明的复制构造函数不是显式构造函数; 可以调用它来进行隐式类型转换.

我没有想法,怎么copy-constructor可以用于implicit类型conversions.如果它是标准中的错误打印/错误,为什么它自C++ 03标准以来没有得到纠正?任何链接和示例(如果我们可以使用它type conversions)都非常感谢.

Mik*_*our 8

复制构造函数可以通过对其进行切片来从派生类型的对象进行转换:

struct A {};
struct B : A {};

B b;
A a = b; // uses A::A(A const&) to convert B to A
Run Code Online (Sandbox Code Playgroud)

  • @JonathanSeng:这是一种方法.我更喜欢避免从非抽象类型继承,因此切片是不可能的.除了抽象接口之外,很少有理由继承其他任何东西. (5认同)
  • 这使得复制构造函数在被忽略时具有内在的危险性。好的做法是,除非你想要它们,否则你应该阻止默认的复制构造函数和赋值运算符。在 C++11 之前,这可以通过将它们声明为私有而不是实现它们来完成(它有助于评论您正在这样做)。在 C++11 中,您可以用 `= delete` 替换实现。 (2认同)