复制构造函数的签名而不引用

Copy constructor's signature without reference

本文关键字:引用 构造函数 复制      更新时间:2023-10-16

如果我有一个Point类,复制构造函数应该如下所示:

Point(const Point &p);
Point(Point &p);

但是,如果我想创建一个需要Point的构造函数,该怎么办?为什么它被认为是复制构造函数,而不是构造函数?

Point(const Point p)

编译器错误:类"Point"的"复制构造函数"可能没有类型为"Point"的参数

不能有复制构造函数签名来按值接受参数。原因很简单——为了按值传递参数,您需要调用复制构造函数,复制构造函数将要求按值传递,并将调用复制构造函数。。。欢迎使用无休止递归。

编译器不允许使用此构造,为您省去了很多麻烦。

Point(const Point p)

为什么它被认为是复制构造函数,而不是构造函数?

事实并非如此。

正如标准在§12.8/2中所说:

X的非模板构造函数是复制构造函数,如果第一个参数的类型为X&const X&volatile X&const volatile X&,并且要么没有其他参数,要么全部是其他参数参数具有默认参数(…)。

事实上,您的声明是格式错误的。§12.8/6说:

如果类X的构造函数声明第一个参数是类型(可选cv限定)X,并且没有其他参数,或者所有其他参数都有默认参数。

您确实拥有:Point类的构造函数,该类的第一个参数类型为const Point,并且没有其他参数。

这当然是正式的解释。正如其他人所解释的,这种构造函数的实际含义是无限递归。

也许您担心收到的错误信息。但是,对于编译器生成的诊断消息的内容,绝对没有任何规则。这是一个实施质量问题;如果您的编译器认为类"Point"的复制构造函数可能没有"Point"类型的参数是将问题传达给用户的好方法,那么就这样吧。