2016-07-11 4 views
1

C++ 11:それはこの短いセンテンスがある 、私はテンプレート引数としてラムダ式を使用しての多くの例を見てきましたが、私は<a href="http://en.cppreference.com/w/cpp/language/lambda" rel="nofollow">cppreference.com</a>でラムダ関数のリファレンスページを読んでいたとき、テンプレート引数としてラムダ式

テンプレート引数、エイリアス宣言、typedef宣言、および関数本体と関数のデフォルト引数を除く関数(または関数テンプレート)宣言のどこでもラムダ式は使用できません。

私は非常に混乱していましたが、この文章が間違っているか正しく理解していませんでしたか?あなたは何ができるか

答えて

4

template <class> 
struct Foo; 

auto l = []{}; 
Foo<decltype(l)> f; 

あなたが行うことができないこと:つまり

template <SomeType lambda> 
struct Foo; 

Foo<[]{}> f; 

を、ラムダのタイプは、他のような通常のタイプですが、ラムダ式テンプレート自体を特殊化するために使用することはできません。同様のことは、オペランドがdecltypeおよびsizeofのような未評価のコンテキストにも当てはまります。

+0

私は間違いを犯しました。私は関数テンプレート引数としてラムダ式を使用することを意図していました。このようなユースケースは、実世界のC++プログラムでは非常に一般的です。テンプレートの控除は、渡されたラムダ関数のクロージャ型のテンプレートパラメータを推定します。 – sniel

+0

@sniel oh、それは関数テンプレートの引数になります。それらには問題はありません。「テンプレート引数」は、上記の種類を特に指します。 – Quentin

関連する問題