0
#include <iostream>
#include <cstdlib>
#include "A.h"

void second(const A& a)
{
    std::cout << "void second(const A& a)." << std::endl;
}

void second(A&& a)
{
    std::cout << "void second(A&& a)." << std::endl;
}

void first(const A& a)
{
    std::cout << "void first(const A& a)." << std::endl;
    second(a);
}

void first(A&& a)
{
    std::cout << "void first(A&& a)." << std::endl;
    second(a); //Make this call void second(A&& a) without using std::move(a) again?
}

int main()
{
    std::cout << "int main()." << std::endl;

    A a;
    first(std::move(a));

    std::cin.sync();
    std::cin.get();
    return EXIT_SUCCESS;
}
4

3 に答える 3

2
second(a);

は左辺値であるため ( nameがあるため)呼び出すsecond(A&&)ことはできません。a

呼び出すsecond(A&&)には右辺値が必要です。したがって、手動の明示的な変換aを使用または実行する必要がある右辺値に変換する必要があります。move

second(std::move(a));        //invokes second(A&&)
second(static_cast<A&&>(a)); //invokes second(A&&)

それが役立つことを願っています。

于 2013-01-13T20:21:35.430 に答える
1

すべての関数の右辺値参照オーバーロードを作成するプロセスは面倒であり、その面倒な作業から身を守る方法を探していますか?オーバーロードを単一の関数に凝縮して、パラメーターを値で取得し、必要な場所に移動することを検討してください。

つまり、これら2つの機能は...

void foo(X const& x) {
    bar(x);
}
void foo(X&& x) {
    bar(std::move(x));
}

...この1つの機能になります

void foo(X x) {
    bar(std::move(x));
}

(タイピングと保守性の)節約は、追加のパラメーターごとに指数関数的に大きくなります。余分な移動が必要になることもありますが、余分なコピーはありません(もちろん、移動コンストラクターがない場合を除きます)。

于 2013-01-13T20:33:55.000 に答える
1

関数の内部

void first(A&& a)

パラメータaは名前付きの値であり、したがって左辺値です。

とにかく、最初の関数呼び出しでそれを移動したくないでしょうa。関数で何度も使用したい場合、多くの問題が発生するからです。検討

void first(A&& a)
{
    second(a);
    third(a);
    fourth(a);
}

second呼び出しで値を から移動させたくないでしょうa

于 2013-01-13T20:24:10.740 に答える