[英]Returning const value from arithmetic operator overload with move assignment
假設我有以下最小示例類:
#include <iostream>
class Foo {
public:
Foo() = default;
Foo(const Foo&) = default;
Foo(Foo&&) noexcept = default;
Foo& operator=(const Foo& rhs) {
std::cout << "copy\n";
return *this;
}
Foo& operator=(Foo&& rhs) noexcept {
std::cout << "move\n";
return *this;
}
Foo operator+(const Foo& rhs) const {
Foo x; // with some calculation
return x;
}
};
int main() {
Foo a, b, c;
a = b + c;
}
此打印move
按預期方式。 現在根據有效的C ++項目3,我應該從operator+
返回const Foo
以避免類似a + b = c
構造,即:
// To avoid a + b = c
const Foo operator+(const Foo& rhs) const {}
不幸的是,這突然開始調用副本分配而不是移動分配運算符。 [我在Ubuntu上使用gcc 4.8.4,但這可能與編譯器無關]
如何確保a + b = c
編譯失敗並且同時為a = b + c
調用移動分配? 還是隨着移動語義的引入,沒有辦法同時實現它們嗎?
我最終使用了Caninonos在注釋中指出的左值引用限定符,並在現在已刪除的答案中使用了max66(但是1萬用戶可以看到它)。
Foo& operator=(const Foo& rhs) & {}
Foo& operator=(Foo&& rhs) & noexcept {}
它的實現很簡單,並且提供了更好的界面設計,因為分配給左值聽起來毫無意義的其他東西以及可能的錯誤源。
但是,應注意,錯誤寫入a + b = c
的可能性非常低。 同樣,編譯器生成的賦值運算符不是左值引用限定的,我們可以使用標准類型(例如,使用std::string
或std::complex
編寫a + b = c
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.