2016-03-25 14 views
5

std::movestd::forwardの区別はよく知られています。後者は転送されたオブジェクトの値カテゴリを保持するために後者を使用し、前者は移動セマンティクスを有効にするためにrvalue参照にキャストします。ガイドラインは右辺値参照、普遍的な参照のstd::forwardの状態いつもstd :: forwardを使うのはなぜですか?

使用std::moveという存在効果的な近代的なC++、で

aがフォワーディング参照単純な右辺値参照ではありません(私たちは値カテゴリを変更したくないとシナリオ)

次のシナリオではまだ

template <class T> 
void f(vector<T>&& a) 
{ 
    some_func(std::move(a)); 
} 

、wouldn」それはまったく同じですか?

template <class T> 
void f(vector<T>&& a) 
{ 
    some_func(std::forward<decltype(a)>(a)); 
} 

これは簡単にこのようなマクロにカプセル化することができますので、

#define FWD(arg) std::forward<decltype(arg)>(arg) 

が、それはいつものように、このマクロ定義を使用すると便利ではないでしょうか?

void f(vector<T>&& a) 
{ 
    some_func(FWD(a)); 
} 

これを書くには2通りの方法がありますか?

+3

マクロソリューションを 'move()'と書くよりも便利です。しかし、これは意見に基づく質問として私を襲う。両方とも同じことを – Barry

+3

としますが、somtimes引数は通常の参照であり、ベクトルを移動したいと思います。転送を使用し続けることはそれを達成しません –

+0

@バリー私はそれらが同等であることの確認、そのためのthnxを望んでいました。私は彼らが意見に基づいているかどうか、単にプログラミングスタイルを主張することはバイアスを意味するものではないことに同意したいと思います、それを行うには非常に良い理由があるかもしれません(そして、それらを詳しく説明することができます) –

答えて

6

Eh。議論の余地がある。あなたの特定の例では、それは同等です。しかし、私はそれを習慣にしません。 1つの理由は、転送と移動の意味を区別する必要があるためです。もう1つの理由は、一貫性のあるAPIを使用するためには、FWDに加えてMOVを追加する必要があり、それは実際には悪く見えて何もしません。しかし、もっと重要なのは、あなたのコードが予期せず失敗するということです。私はちょうどFWDを変更した場合、

しかし

#include <iostream> 

using namespace std; 

#define FWD(arg) std::forward<decltype(arg)>(arg) 

struct S { 
    S() { cout << "S()\n"; } 
    S(const S&) { cout << "S(const S&)\n"; } 
    S(S&&) { cout << "S(S&&)\n"; } 
}; 

void some_func(S) {} 

void f(S&& s) 
{ 
    some_func(FWD(s)); 
} 

int main() 
{ 
    f(S{}); 
} 

これは

S()
Sを出力(S & &):

は、次のコードを考えてみましょう他の(一見オプションの)ペアのparenth ESEは、次のように:

void f(S&& s) 
{ 
    some_func(FWD((s))); 
} 

は、今、私たちは

S()
S(定数S &)

を得るそして今、我々は上decltypeを使用しているためです式は左辺値参照として評価されます。

+0

あなたは良い点を作っています。しかし、私はかっこの「一見オプション」のキャラクタライゼーションには同意しない。もし、 'decltype'で作業しているなら、[this stuff](http://stackoverflow.com/a/17242295/4224575)を知っていなければなりません。これは' std :: forward

+2

@Lorahええ、それはマクロなので、すぐには 'decltype'を使うことはできません。 – Barry

+0

@Barryもしそれが関数であったとしても、あなたはいつもそのコードを読まなければなりません。私は主に、マクロに関連する「透明性の欠如」を、コードを読むときでさえ明らかでない「奇妙な副作用や変異の突然変異」(式の2回の評価など)を把握しています。私は 'FWD'すなわちテキスト置換(ダブル評価無し、付随的なデータ構造なし、隠れたコントロールフローなし)のような理由でマクロを使用するのではありません。あなたは[this](http://stackoverflow.com/q/36230428/4224575)を見てくださいありますか? (それは話題ですが、私はいくつかの助けを使うことができます) –

関連する問題