私は奇妙な問題に遭遇しました。次の簡略化されたコードは、MSVC 2010 の問題を再現します。
template <typename T>
struct dummy
{
static T foo(void) { return T(); }
};
int main(void)
{
typedef dummy<bool> dummy_type;
auto x = []{ bool b = dummy_type::foo(); };
// auto x = []{ bool b = dummy<bool>::foo(); }; // works
}
関数でローカルに作成したtypedef
は、ラムダでは表示されないようです。typedef
を実際の型に置き換えると、期待どおりに機能します。
その他のテストケースは次のとおりです。
// crashes the compiler, credit to Tarydon
int main(void)
{
struct dummy {};
auto x = []{ dummy d; };
}
// works as expected
int main(void)
{
typedef int integer;
auto x = []{ integer i = 0; };
}
現在、テストに使用できる g++ がありません。これは C++0x の奇妙なルールですか、それともコンパイラの単なるバグですか?
上記の結果から、私はバグに傾いています。クラッシュは間違いなくバグですが。
今のところ、2 つのバグ レポートを提出しました。
上記のすべてのコード スニペットをコンパイルする必要があります。このエラーは、ローカルで定義されたスコープでスコープ解決を使用することに関係しています。(dvideによって発見されました。)
そして、クラッシュバグは... 誰が知っている. :)
アップデート
バグ レポートによると、これらは両方とも Visual Studio 2010 の次のリリースで修正されています。