我检查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,那么遵循的正确方法是什么?
[显式拷贝构造函数]可能的重复(http://stackoverflow.com/questions/11480545/explicit-copy-constructor) – Predelnik 2015-04-06 13:54:52
很可能'+ ='和' - ='正在创建隐式拷贝,导致错误。 – NathanOliver 2015-04-06 13:56:49
不是答案,而是对您的代码的评论。根本没有理由定义这样的复制构造函数,因为默认的构造函数完全一样。通常也有理由声明复制构造函数是明确的,因为它的目的是防止隐式类型转换。 – MikeMB 2015-04-06 14:00:06