19

重複の可能性:
テンプレート化された関数は、ラムダ引数を値または右辺値参照で受け取る必要がありますか?

C++ 標準ライブラリ関数は、次のようにファンクター (関数ポインターまたは関数オブジェクト) 引数を値で受け取ります。

template <typename F>
void apply(F func)
{
    func();
}

...しかし、 Universal Referenceでファンクターを渡すほうがよいのではないでしょうか? そのようです:

template <typename F>
void apply(F&& func)
{
    func();
}

このようにして、状態を維持する関数オブジェクトを渡し、高階関数が戻った後にその (おそらく変更された) 状態にアクセスできます。

4

1 に答える 1

8

これはすでにいくつかのアルゴリズムに当てはまります。たとえば、g++ 4.7.0

//stl_algo.h

template<typename _RandomAccessIterator, typename _UniformRandomNumberGenerator>
void
shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
    _UniformRandomNumberGenerator&& __g)
{
    ...
}

明らかに、それは乱数発生器のようなものにとって不可欠です。しかし、これはやがてもっと一般的なものになると思います。

于 2012-12-19T07:25:33.340 に答える