私は最近、インターネットでラムダ式について少し読んでいましたが、C++0x のラムダ式には、ラムダ式にのみバインドされる単一の型 (または型) がないように思われます。つまり、ラムダ式です。式は、テンプレート引数またはauto
引数/変数のみに一致します。hereで説明されているように、何が起こるかというと、
ラムダをサポートするコンパイラは、ラムダ式ごとに一意の匿名ファンクター型を作成します
私の質問は、それは悪いことですか? ラムダ式のみに一致するキーワードを使用することは理にかなっていますか?たとえばlambda
、次のように機能します
void f(std::function<int(int)> func)
{
func(2);
}
template<typename T>
void g(T func)
{
func(2);
}
void h(lambda func)
{
func(2);
}
int main()
{
int fpointer(int);
struct { int operator()(int var) { return var; } } functor;
f(fpointer); //ok (actually a linker error, but for the sake of example)
f(functor); //ok
f([](int var) { return var; }); //ok
g(fpointer); //ok
g(functor); //ok
g([](int var) { return var; }); //ok
h(fpointer); //error -- function pointer isn't a lambda expr
h(functor); //error -- functor isn't a lambda expr
h([](int var) { return var; }); //ok
return 0;
}
正直なところ、これの有用性は実際にはわかりません (特に がauto
ラムダ式を受け入れるため、変数にラムダを割り当てることができる場合)。また、特定の 1 つのタイプだけにバインドすることはできません (他のすべてのタイプを除外して)。
本質的に、私の質問は、ラムダ式が匿名であっても問題ないかということです(ユーティリティの観点から-lambda
型の欠如は私たちにいくつかの機能を奪いますか-そして哲学的に-ラムダ式が常に持っていることは本当に意味がありますか? 「タイプ」auto
)?