この質問は私の最近の質問の続きです:
What is this compiler error when using a lambda as a template parameter?λを返すラムダは、戻り値の型を間違って推定しますか?
2014年11月11日:マイクロソフトは、このバグの修正は、Visual Cの++の次のメジャーリリースで表示されるはずですと言って対応してきました。
このコードは、VS2012(更新2)を使用してコンパイルに失敗します。
int main(int argc, char* argv[])
{
auto f = []()
{
int n = 0;
auto r = [=]{ return n; };
return r;
};
return 0;
}
これは私が取得コンパイラエラーです:
1> main.cpp
1>C:\test\main.cpp(7): error C2440: 'return' : cannot convert from 'main::<lambda_c5d1d707b91a1ddedc06eb080503550c>::()::<lambda_ac357c309731f4971c3269160ed9c24b>' to 'int (__cdecl *)(void)'
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
- 問題はありますか C++ 11仕様のコードを使用していますか?
- VS2012の部分C++ 11サポートで定義されているコードに問題はありますか?
- これはVS2012 C++コンパイラのバグですか?
- 誰かがラムダは、関数ポインタに暗黙的にキャスト可能でなければならないかについて語っC++ 11の仕様に場所に私を指すもらえますか?では、なぜラムダ
f
の推測された戻り値の型が関数であることを表示されない内側のラムダr
がない - ある - 空のキャプチャ句を持つもの -
- 私はこれが唯一のステートレスラムダのためであることを思い出しますポインタ、つまり
int (__cdecl *)(void)
?
- 私はこれが唯一のステートレスラムダのためであることを思い出しますポインタ、つまり
するのは、それが原因で貧困層のだとしましょう実装:-) –
@CaptainObvlious OK - しかし、関数ポインタへのキャストは明示的に禁止されています*ステートフル* lambdas、正しい? –
[私の以前のコメントにどういう_ _ "not" _が入っているのかわかりません;)] 5.1.2/6によれば、取り込みがなければ変換は必要です。標準では、ステートフルなラムダには変換が含まれないように_explicitly_禁止しています。ステートフルなラムダであっても、実装に自由に変換を含めることはできません。 –