10

C ++ 11では、メソッドが呼び出されるオブジェクトを表す式が左辺値であるか右辺値であるかによって、メソッドをオーバーロードできます。*this右辺値を介して呼び出されたメソッドから戻る場合、明示的にmovefromする必要があり*thisますか?

Foo Foo::method() &&
{
    return std::move(*this);   // Is this move required or not?
}

残念ながら、g ++はまだこの機能をサポートしていないため、コンパイラでこれを簡単にテストすることはできません:(

4

1 に答える 1

4

のタイプ*this常に左辺値です。

§9.3.2 [class.this] p1

非静的(9.3)メンバー関数の本体では、キーワードthisはprvalue式であり、その値は関数が呼び出されるオブジェクトのアドレスです。thisクラスのメンバー関数のタイプXはですX*。[...]

§5.3.1 [expr.unary.op] p1

単項演算*子は間接参照を実行します。適用される式は、オブジェクト型へのポインタ、または関数型へのポインタであり、結果は、式が指すオブジェクトまたは関数を参照する左辺値になります。

std::moveしたがって、moveコンストラクターを呼び出す場合はそうする必要があります。

次のコードスニペットは、次のことを示しています。

#include <iostream>
#include <utility>

struct test{
  test(){}
  test(test const&){ std::cout << "copy ctor // #1\n"; }
  test(test&&){ std::cout << "move ctor // #2\n"; }

  test f_no_move() &&{ return *this; }
  test f_move() &&{ return std::move(*this); }
};

int main(){
  test().f_no_move(); // #1
  test().f_move(); // #2
}

Clang 3.1(ref-qualifiersを実装することがわかっている唯一のコンパイラー)を使用すると、次の出力が得られます。

$ clang ++ -std = c ++ 0x -stdlib = libc ++ -pedantic -Wall t.cpp
$ ./a.out
copy ctor //#1
move ctor //#2

于 2011-12-23T22:17:42.323 に答える