4
#include <iostream>

class Foo { };

Foo createFoo() { return Foo(); }

void bar(Foo &&) { std::cout << "in bar(Foo &&)\n"; }

void bar(Foo const &) { std::cout << "in bar(Foo const &)\n"; }

void baz(Foo &&f) {
    std::cout << "in baz, ";
    bar(f);
    // bar(std::move(f));
}

int main()
{
    baz(createFoo());
    return 0;
}

私の予想される出力は:in baz, in bar(Foo &&)ですが、取得しています: in baz, in bar(Foo const &)。呼び出しをbar(コメントを参照)に切り替えると、期待される出力が得られますが、これは間違っているようです。aを a にbar(Foo &&)変換しないとコンパイラが呼び出せない理由はありますか?Foo&&Foo&&

前もって感謝します!

4

2 に答える 2

13

内部baz(Foo&& f)左辺値fです。したがって、右辺値参照として渡すには、右辺値にキャストする必要があります。、または でこれを行うことができます。barstatic_cast<Foo&&>(f)std::move(f)

bar(f)これは、たとえばinsideを複数回呼び出して、同じ関数内で誤って複数回移動することを避けるためbazです。

于 2012-05-15T15:52:17.437 に答える
4

つまり、名前付き右辺値参照は左辺値であるというルールです。これは、後で使用する必要がある名前付き変数から自動的に移動するのを防ぐためです。対照的に、名前のない一時ファイルは二度と使用できないため、自動的に移動できます。

このシリーズhttp://cpp-next.com/archive/2009/08/want-speed-pass-by-value/は少し古いですが、かなり役立つことがわかりました。

于 2012-05-15T15:56:25.707 に答える