2011-01-08 26 views
11

誰かが "これを* thisに移動の意味を拡張する"ということを普通の英語で説明できますか? I am referring to this proposal。探しているものはすべてです。は& です。理由はです。右辺値の参照が一般的で、移動セマンティクスが構築されていることを理解しています。そのような拡張がrvalue参照に何を追加するのか把握できません!「* thisへの移動セマンティクスの拡張」とは何ですか?

答えて

10

ref-qualifier機能(タイプを示す*this)により、rvaluesまたはlvalues(またはその両方)でメンバー関数を呼び出すことができ、それに基づいて関数をオーバーロードするかどうかを区別できます。 first versionは非公式の部分にいくつかの根拠を与える:

防ぐ驚き:

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 
+0

感謝を。いい答え。 – AraK

7

ご希望の場合たとえば、あなたは右辺値参照と無料の関数としての演算子をオーバーロードすることができます

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

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

をメンバ関数と同じ効果を達成するために、あなたが引用された提案書を必要とします

ダブルアンパサンドは、 "このメンバ関数は右辺値でのみ呼び出すことができます"と言います。

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

+0

感謝:) – AraK

関連する問題