2017-09-05 12 views
1

rvalue引数を持つ関数がいくつかあります。 rvalue引数も持つ他の関数があります。我々は右辺値としてパラメータを渡すためにstd::moveを使用しているため、私はstd::moveを使用std :: forward非テンプレート関数

void inner(int&& a) 
{/* ... */} 

void outer(int&& a) 
{ 
    inner(std::move(a)); 
} 

:最初の関数は、第2の機能を呼び出します。しかし、私の同僚は、私たちが前方にここに右辺値参照を(移動しない)ので、std::forwardはこちらより適切であることを言った:

void outer(int&& a) 
{ 
    inner(std::forward(a)); 
} 

が、それは本当ですか?どちらがより正しいですか?

+1

あなたの 'std :: forward'の例は、推論されていないコンテキストのためにコンパイルされないので、私はそれを使わないと思います。 – LogicStuff

答えて

2

フォワードは条件付き移動です。ここでは、if (true)に文をラップする必要があると言います。

+1

私は多くの文を 'if(true)'で囲んでいましたが、良いコードが対称であると言われていましたが、今は 'if(true == true)'を一貫して使います。 –

+0

@kerrekはスタイルの一般的なルールとして 'if(A == B)'があいまいです。 'A == B'は何ですか? 'if((A == B)== true)'を実行して明確にします。 – Yakk

+0

あなたは正しいです - リファクタントに! –

1

フォワードの使用方法は若干異なります。これは次のように使用されます:

void outer(int&& a) 
{ 
    inner(std::forward<int>(a)); 
} 

フォワードがないため、フォワードは実際には混乱します。

転送の参照と参照の崩壊のために転送が存在します。それらを取り除き、それ以上のフォワーディングマジックを取り除きません。

あなたの場合、値の参照を受け取りました。それを動かすことは正しいことです。

Forwardは、移動したい変数の宣言された型に依存する条件付き移動です。その変数が左辺値参照の場合、std::forward<T>(t)はそれを移動しません。

関連する問題