复制构造函数的签名而不引用
Copy constructor's signature without reference
如果我有一个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"类型的参数是将问题传达给用户的好方法,那么就这样吧。
相关文章:
- 在类构造函数中传递对外部函数的引用
- 在 c++ 中将变量作为结构构造函数中的引用传递
- C++ 尝试在不存在的构造函数中引用已删除的函数(使用 rapidJson)
- 移动构造函数和右值引用
- 为什么我的运算符 + 重载尽管是通过引用传递的,但仍调用我的复制构造函数?
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- 在引用初始化中使用已删除的复制构造函数进行复制初始化
- C++:右值引用构造函数和复制省略
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- 引用构造函数时链接失败
- 为什么调用转发引用构造函数而不是复制构造函数?
- 为什么使用已删除的右值引用构造函数?
- 对 std::Optional 的转发引用构造函数的约束
- 模板是否应该为不同类型的参数制作非 Rvalue 引用构造函数/赋值
- 我是否应该对非引用构造函数参数手动调用move
- 使用左值引用错误地调用了Rvalue引用构造函数
- C++未定义的引用构造函数错误
- 调用左值引用构造函数而不是右值引用构造函数
- C++引用构造函数语法
- 不能引用构造函数的地址