簡體   English   中英

從帶有移動分配的算術運算符重載返回const值

[英]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::stringstd::complex編寫a + b = c

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM