我遇到了一个奇怪的问题。以下简化代码重现了 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
}
The 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 中的一些奇怪规则,还是只是编译器中的一个错误?
从上面的结果来看,我倾向于错误。尽管崩溃肯定是一个错误。
目前我已经提交了两份错误报告.
上面的所有代码片段都应该可以编译。该错误与在本地定义的范围上使用范围解析有关。 (发现者dvide.)
崩溃错误与……谁知道呢。 :)
Update
根据错误报告,它们都已在 Visual Studio 2010 的下一版本中得到修复。(尽管情况似乎并非如此;也许是 VS11。)
从n3000,5.1.2/6,
lambda 表达式的
复合语句产生
函数的函数体 (8.4)
呼叫接线员,但出于以下目的
名称查找(3.4),...
复合语句被认为是
lambda 表达式的上下文。
毫不奇怪,本地类型应该是可见的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)