【发布时间】:2011-01-08 12:00:46
【问题描述】:
我遇到了一个奇怪的问题。以下简化代码重现了 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 在 lambda 中似乎不可见。如果我将 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 中的一些奇怪规则,还是只是编译器中的错误?
从上面的结果来看,我倾向于 bug。虽然崩溃绝对是一个错误。
目前,我已经提交了两个bug reports。
上面的所有代码 sn-ps 都应该编译。该错误与在本地定义的范围上使用范围解析有关。 (被dvide发现。)
而崩溃错误与...谁知道呢。 :)
更新
根据bug reports,它们都已在 Visual Studio 2010 的下一个版本中得到修复。(虽然这似乎不是这种情况;也许是 VS11。)
【问题讨论】:
-
与本地命名空间别名相同
-
所有三个测试用例都使用英特尔 C++ 编译器 11.1 成功编译。
-
三个测试用例都使用g++ 4.5编译成功。
标签: c++ lambda c++11 compiler-bug