2011-07-07 5 views
42

誰かがxvalues、glvalues、およびprvaluesの実際の人生の例を教えたり、説明したりできるかどうか疑問に思っていましたか?私は同様の質問を読みました:xvalues、glvalues、およびprvaluesの実生活の例は?

What are rvalues, lvalues, xvalues, glvalues, and prvalues?

が、私は誰もが何を意味するのか理解できませんでした。どのような場合にこれらの値が重要であり、いつそれらを使用すべきか説明することができますか?

+14

「実生活の例」?あなたは、スーパーマーケットでxvalueを見つけたり、あなたの車がlvalueとして分類できるかどうか疑問に思うようなことを意味しますか? – jalf

+0

hehe、実用的な例を意味していた –

答えて

46

は、以下のクラスを考慮してください

class Foo 
{ 
    std::string name; 

public: 

    Foo(std::string some_name) : name(std::move(some_name)) 
    { 
    } 

    std::string& original_name() 
    { 
     return name; 
    } 

    std::string copy_of_name() const 
    { 
     return name; 
    } 
}; 

発現some_foo.copy_of_name()copy_of_nameオブジェクトstd::string)、ない参照を返すため、prvalueあります。すべての価値観はまた価値でもあります。 original_nameが左辺値参照std::string&)を返すため(右辺値より一般的である。)

発現some_foo.original_name()は、左辺値あります。すべての左辺値もglvalueです。 std::moveが右辺値参照std::string&&)を返すため(Glvaluesより一般的である。)

発現std::move(some_name)は、はxValueあります。すべてのxvalueは、glvalueとrvalueの両方です。


注オブジェクトと参照用の名前は常に左辺値されていること:上記の宣言を考える

std::string a; 
std::string& b; 
std::string&& c; 

を、表現abcは左辺値です。

+0

rvalue参照はいつ使用する必要があるのか​​説明できますか? –

+0

@ M3taSpl0it:移動コンストラクタと移動代入演算子は、rvalue参照パラメータを持ちます。それとは別に、彼らにはほとんど役に立たない。ほとんどの場合、それらはライブラリのコードの中に埋め込まれています。独自のコードでは、値の参照を気にする必要はありません。 – fredoverflow

+0

基本的に重要な例がありません。 cv修飾された参照を返す関数: 'std :: string const&reference_of_name()const'。これは正価になるでしょうか? –

関連する問題