我檢查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