2011-07-28 32 views
0

私が知っていることによると、左辺値を右辺値参照にバインドすることはできません。 そして第二に、左辺値の式は、この2つの文には、次のコードでarecorrect場合、私はトラブルに少しだという事実によって、それは住所-のオペレータによるプレフィックス、(&)左辺値の左辺値と右辺値へのバインドと戻り値

することができ、認識です:

#include<iostream> 

struct Foo 
{ 
    Foo(Foo&& other) 
    { 
     std::cout << "move ctor called"; 
    } 

    Foo(const Foo& other) 
    { 
     std::cout << "copy ctor called"; 
    } 

    Foo(){} 
}; 

Foo return_foo() 
{ 
    Foo f; 
    return f; 
} 


void main() 
{ 
    Foo f = return_foo(); // Move ctor is called, but return_foo() is a lvalue ?? 
    std::cin.ignore();  
} 

どこが間違っていますか?

+5

'main'は' int'を返します。 – GManNickG

+1

... return_foo()は左辺値です... –

+2

以下のVitusはreturn_foo()がprvalue – Guillaume07

答えて

4

return_foo()は、(名前のない一時オブジェクトを返すため)prvalueを返します。 prvalue( "pure" rvalue)は、xvalueではないrvalueです。これは、§3.10/ 1の強調点です。

prvalue [ 例:戻り値の型が ではない関数を呼び出した結果は、評価値です。 12、7.3e5、または などのリテラルの値もまた値です。末端例]

+0

であることを示していますので、すべての左辺値式と前にxvalueでないすべての右辺値式を置くことができます – Guillaume07

+0

Ifあなたはアドレスの演算子として '&'を意味します。 '&'は左辺値でのみ動作するビルトイン演算子です。ただし、一時オブジェクト(rvalues)のメンバ関数を呼び出すことができるため、この演算子をクラス内でオーバーロードするクラス型(つまり、メンバ関数)として使用できます。 – Vitus

+0

しかし、return_foo()とreturn_foo()の前に&lvalueはありません。 – Guillaume07

2

右辺値、すなわち、以下が等価であるとして、一時的に返すことができ、特別なルールがあります - 明示的な「私はもうこれを必要としない」バージョン:

T foo() 
{ 
    T t(a, b, ...); // constructed somehow 
    /* ... */ 
    return std::move(t); 
} 

int main() 
{ 
    T t = foo(); // we can move-construct this 
} 
は、

...と暗黙のバージョン:

T foo() 
{ 
    T t(a, b, ...); 
    /* ... */ 
    return t; // implicitly allow moving 
} 

このすべてが、戻り値の最適化後の起こります。つまり、値を返すことは、実際には多くの場合非常に効率的です。

+0

あなたの例では、 't'は実際には関数型ですから、' T t'や 'T t {}'と書いたかったと思います。標準の関連する部分は§12.8/ 31と§12.8/ 32です。 - コピー操作の抽出基準が満たされ(...)、コピーされるオブジェクトが左辺値で指定された場合、オーバーロードの解像度は に選択されます。右辺値。 – Vitus

+0

@Vitus:ありがとう、修正済み - 仮引数をいくつか提供するつもりだったが、忘れてしまった。一定!関連する見積もりにも感謝します! –

+0

明確にするために、特別なルールは、潜在的に 't'のコピーを(まだNRVOを許可しながら)移動に最適化することです。しかし、そのコピーや移動は、概念的に*機能の内部で行われます。 'foo()'は実際の 'return'式が何であるか、コピーや移動、あるいはNRVOが起こったかどうかに関わらず、その型が' T() 'なので、常にprvalueになります。 –

関連する問題