4

C++11 では、オブジェクトの不必要なコピーを回避しstd::move、そうでなければコピーが発生する場合にそれらのセマンティクスを適用するためのセマンティクスが導入されています。ただし、デフォルトではなく、コピーが必要な場合もあります。

reverseたとえば、この単純な の実装を考えてみましょう。範囲ベースforでは完全転送が使用されるため、ループ内でコンテナーを変更すると破損します。

auto out_iter = container.rbegin();
for ( auto value : container ) {
    * out_iter ++ = value;
}

目標は、これを使用して修正することです

for ( auto value : copy( container ) ) {

それは十分に単純に思えます…任意の引数を受け入れ、基になる型を取得し、一時的なコピーを返します。

4

1 に答える 1

8

計算している戻り値の型は、 としてよく知られていtypename std::decay<T>::typeます。それ以外はstd::forward、本体で使用して、完全転送の利点を最大限に活用してください。

template<typename T>
typename std::decay<T>::type
val(T&& t)
{ return std::forward<T>(t); }
于 2011-09-11T05:37:09.227 に答える