重複の可能性:
c++0x の再帰ラムダ関数
次のように記述した場合、ラムダを再帰的に呼び出すことができないのはなぜですか。
auto a = [&]
{
static int i = 0; i++;
std::cout << i << std::endl;
if (i<10)
a(); //recursive call
};
コンパイル エラー ( ideone )が発生します。
prog.cpp:8:18: error: '((const main()::<lambda()>*)this)->main()::<lambda()>::a' cannot be used as a function
prog.cpp: In function 'int main()':
prog.cpp:9:9: error: variable 'auto a' with 'auto' type used in its own initializer
エラーの意味は何ですか?
これを書けない理由が分かりました:
auto i=i+1; //error: unable to deduce 'auto' from '<expression error>'
i
の型は初期化から推測する必要があるi
ため、これを書くことはできません。しかし、ラムダの場合、それはどのように重要なのでしょうか? 私が間違っていなければ、ラムダの型はそのパラメーターと戻り値の型によって決まります。何も返さない場合は本体に依存しません (この場合、void
ラムダ本体の他のステートメントに関係なく、戻り値の型は と推定されます)。
とにかく、回避策があり、std::function
代わりに次のように使用できます。
std::function<void()> a = [&]
{
static int i = 0; i++;
std::cout << i << std::endl;
if (i<10)
a();
};
罰金をコンパイルします(ideone)。auto
しかし、バージョンがコンパイルされない理由を知りたいと思っています。