11

「ムーブ セマンティクスを *this に拡張する」とは何かをわかりやすい英語で説明してもらえますか? 私はこの提案に言及しています。探しているのは、それが何であるか、なぜそれが必要なのかということだけです。ムーブセマンティクスが構築される右辺値参照が一般的に何であるかを理解していることに注意してください。そのような拡張が右辺値参照に何を追加するかを把握できません!

4

2 に答える 2

10

ref-qualifier 機能 (の型を示す*this) を使用すると、メンバー関数を右辺値または左辺値 (またはその両方) で呼び出すことができるかどうかを区別し、それに基づいて関数をオーバーロードできます。最初のバージョンでは、非公式の部分でいくつかの根拠を示しています。

驚きを防ぐ:

struct S {
  S* operator &() &;            // Selected for lvalues only
  S& operator=(S const&) &;     // Selected for lvalues only
};

int main() {
  S* p = &S();                  // Error!
  S() = S();                    // Error!
}

移動セマンティクスを有効にします。

class X {
   std::vector<char> data_;
public:
   // ...
   std::vector<char> const & data() const & { return data_; }
   std::vector<char> && data() && { return data_; } //should probably be std::move(data_)
};

X f();

// ...
X x;
std::vector<char> a = x.data(); // copy
std::vector<char> b = f().data(); // move
于 2011-01-08T10:47:29.027 に答える
7

たとえば、必要に応じて、演算子を右辺値参照を持つフリー関数としてオーバーロードできます。

Foo operator+(Foo&& a, const Foo& b)
{
    a += b;
    return std::move(a);
}

メンバー関数で同じ効果を得るには、引用された提案が必要です。

Foo Foo::operator+(const Foo& b) &&   // note the double ampersand
{
    *this += b;
    return *this;
}

二重アンパサンドは、「このメンバー関数は右辺値でのみ呼び出すことができる」ことを示しています。

*thisこのようなメンバー関数から明示的に移動する必要があるかどうかについては、ここで説明します。

于 2011-01-08T10:40:26.863 に答える