10

以下の最小限の例を考えてみましょう。

#include<utility>

struct S { };

int main() {
    S s;
    std::move(s) = S{};
}

エラーなしでコンパイルされます。
代わりに非クラス型を使用すると、エラーが発生します。
例として、以下のコードはコンパイルされません。

#include<utility>

int main() {
    int i;
    std::move(i) = 42;
}

列挙型、スコープ付き列挙型などでも同じことが起こります。
エラー(GCCから)は次のとおりです。

xvalue (右辺値参照) を左辺値として使用する

この背後にある理論的根拠は何ですか?

それは正しいと思いますが、クラス以外のすべてのタイプでそれを行うことができる理由を理解したいと思います。

4

2 に答える 2

5

C++ では、クラス オブジェクトの右辺値への代入は許可されますが、プリミティブ型の右辺値への代入は許可されません。

例、

string s1, s2;
s1 + s2 = "asdf"; // ok since rvalue s1 + s2 is an object

int i1, i2;
i1 + i2 = 10;  // error, since i1 + i2 is a primitive type

同じルールがあなたの質問にも当てはまります。std::move(s) はオブジェクト型の右辺値を返しますが、std::move(i) はプリミティブ型の右辺値を返します。

于 2016-05-05T07:42:43.753 に答える