显式复制构造函数编译错误

时间:2015-04-06 13:47:59

标签: c++ c++11 constructor

我正在检查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,那么正确的方法是什么?

2 个答案:

答案 0 :(得分:5)

您定义了一个显式的复制构造函数,但函数是

Vector Vector::operator+(const Vector& v) const

Vector Vector::operator-(const Vector& v) const
由于explicit(换句话说,他们无法将tmp复制到返回的对象中),

必须按值返回,并且不能再返回。

  

我还在检查来自C ++ 11的新东西,并且发生了我可以将我的构造函数声明为移动构造函数   explicit Vector(const Vector&& v);并且代码编译得很好。如果我这样做,我是否必须同时拥有复制和移动构造函数?

不确定我明白你的意思。如果只声明一个显式移动构造函数(这会阻止编译器生成默认的复制构造函数),您将遇到同样的问题。我无法制作一个可编辑的"码。

答案 1 :(得分:0)

按值返回对象要求可以执行隐式复制构造。使复制构造函数显式可以防止这种情况。

无论编译器是否选择不调用复制构造函数(例如返回值优化),都是如此。