隐式复制构造函数

7

n3337 12.3.1/3引用:

非显式复制/移动构造函数(12.8)是一种转换构造函数。隐式声明的复制/移动构造函数不是显式构造函数;它可以用于隐式类型转换。

ANSI ISO IEC 14882 2003引用:

非显式复制构造函数(12.8)是一种转换构造函数。隐式声明的复制构造函数不是显式构造函数;它可以用于隐式类型转换。

我不知道如何使用复制构造函数进行隐式类型转换。如果这是标准中的错误,为什么自C++03标准以来没有被更正?如果我们可以将其用于类型转换,则非常感谢任何链接和示例。


2
+1 为了提出这个问题。即使在阅读你在其他主题中引用的标准文本后,我也有这个疑问。 - Nawaz
2个回答

9

复制构造函数可以通过切片将派生类型的对象转换:

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

B b;
A a = b; // uses A::A(A const&) to convert B to A

2
如果忽略了复制构造函数,那么它们本质上是危险的。良好的实践是,除非你需要它们,否则应该防止默认的复制构造函数和赋值运算符。在C++11之前,可以通过将它们声明为私有并不实现它们来实现这一点(最好注释说明你正在这样做)。在C++11中,你可以用= delete替换实现。 - Jonathan Seng
6
这是一种方法。我更喜欢避免从非抽象类型继承,这样就不可能进行切片操作。除了抽象接口以外,很少有好的理由去继承其他任何东西。 - Mike Seymour

0
在隐式内联中,内联成员函数在类定义内部被定义。不使用关键字inline。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接