std::move
とstd::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通りの方法がありますか?
マクロソリューションを 'move()'と書くよりも便利です。しかし、これは意見に基づく質問として私を襲う。両方とも同じことを – Barry
としますが、somtimes引数は通常の参照であり、ベクトルを移動したいと思います。転送を使用し続けることはそれを達成しません –
@バリー私はそれらが同等であることの確認、そのためのthnxを望んでいました。私は彼らが意見に基づいているかどうか、単にプログラミングスタイルを主張することはバイアスを意味するものではないことに同意したいと思います、それを行うには非常に良い理由があるかもしれません(そして、それらを詳しく説明することができます) –