【发布时间】:2015-06-10 22:14:49
【问题描述】:
我在检查 C++ 中的运算符重载时遇到了一些我没想到的东西,对此我有些怀疑。
我的复制构造函数被声明并实现为
explicit Vector(const Vector& v);
Vector::Vector(const Vector& v) :
_x(v._x), _y(v._y), _z(v._z) {}
然后我重载了复合赋值运算符
Vector Vector::operator+(const Vector& v) const
{
Vector tmp(*this);
tmp += v;
return tmp;
}
Vector Vector::operator-(const Vector& v) const
{
Vector tmp(*this);
tmp -= v;
return tmp;
}
但是,在 return 语句中,我收到错误消息 no matching constructor for initialization of 'Vector'。
由于我添加到构造函数中的唯一内容是 explicit 关键字,因此我将其删除并且代码编译得很好,为什么?
我也在检查 C++11 的新内容,发现我可以像移动构造函数一样声明我的构造函数
explicit Vector(const Vector&& v);
并且代码编译得很好。如果我这样做,我是否必须同时拥有复制和移动构造函数?
explicit Vector(const Vector& v);
explicit Vector(const Vector&& v);
或者只有移动构造函数可以正常工作?如果我想坚持 C++11,正确的做法是什么?
【问题讨论】:
-
Explicit copy constructor 的可能重复项
-
+=和-=很可能正在制作导致错误的隐式复制。 -
不是答案,而是对您的代码的评论。根本没有理由定义这样的复制构造函数,因为默认构造函数的作用完全相同。通常也有理由显式声明复制构造函数,因为它的目的是防止隐式类型转换。
-
@MikeMB "显式声明复制构造函数,因为它的作用是防止隐式类型转换" 比如?
-
@curiousguy:抱歉,措辞不当:应该阅读“通常没有理由显式声明复制构造函数,因为它的 [显式关键字] 目的是防止隐式类型转换。”这不是制作副本时发生的情况。
标签: c++ c++11 constructor