8

cppreference.comによると、move署名があります

template< class T >
typename std::remove_reference<T>::type&& move( T&& t ) noexcept;

引数として右辺値参照を使用するのはなぜT&& tですか?

また、次のコードを試したとき

void foo(int&& bar) {
    cout << "baz" << endl;
}

int main(){
    int a;
    foo(a);
}

コンパイラから「右辺値参照を左辺値にバインドできません」というエラーが表示されました

何が起こっている?私は困惑している。

4

1 に答える 1

10

これは右辺値参照ではなく、転送参照です。引数の値カテゴリを保持できます。つまりstd::move、左辺値と右辺値の両方を取り、それらを無条件に右辺値に変換できます。

転送参照は、関数の引数の値カテゴリを保持する特別な種類の参照であり、std::forward を使用して転送できるようにします。転送参照は次のいずれかです。

1) 同じ関数テンプレートの cv 非修飾型テンプレート パラメーターへの右辺値参照として宣言された関数テンプレートの関数パラメーター:

2) 波括弧で囲まれた初期化子リストから推定される場合を除き、auto&&。

一方、int&&右辺値参照です。ここでの違いに注意してください。関数テンプレート パラメーターにテンプレート パラメーターを持つ型T&&Tつまり推定型Tがある場合、パラメーターは転送参照です。

于 2017-12-17T05:11:53.667 に答える