0

私が知っていることによると、左辺値を右辺値参照にバインドすることは無効です。そして第二に、左辺値式は、アドレス-of演算子(&)によって接頭辞を付けることができるという事実によって認識できます。

この2つの文が次のコードで正しい場合、私は少し困っています。

 #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();    
}

私が間違っているところは?

4

2 に答える 2

4

return_foo()prvalueを返します(名前のない一時オブジェクトを返すため)。§3.10/1からの引用、強調鉱山:

prvalue(「純粋な」右辺値)は、x値ではない右辺値です。[例:戻り型が参照ではない関数を呼び出した結果は、prvalueです。12、7.3e5、またはtrueなどのリテラルの値もprvalueです。—例を終了]

于 2011-07-28T20:33:23.547 に答える
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
}

これはすべて、戻り値の最適化後に発生します。これは、値による戻りが実際には多くの状況でかなり効率的であることを意味します。

于 2011-07-28T20:59:24.017 に答える