GMa*_*ckG 12 c++ lambda compiler-bug c++11
我遇到了一个奇怪的问题.以下简化代码重现了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
}
Run Code Online (Sandbox Code Playgroud)
该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; };
}
Run Code Online (Sandbox Code Playgroud)
我现在还没有可用于测试它的g ++.这是C++ 0x中的一些奇怪的规则,还是编译器中的一个错误?
从上面的结果来看,我倾向于bug.虽然崩溃肯定是一个错误.
目前,我已经提交了两份错误报告.
上面的所有代码片段都应该编译.该错误与在本地定义的范围上使用范围解析有关.(由dvide发现.)
崩溃的bug与...谁知道.:)
根据错误报告,它们都已针对Visual Studio 2010的下一个版本进行了修复.(虽然情况似乎并非如此;也许是VS11.)
从n3000,5.1.2/6,
lambda-expression的复合语句产生函数调用操作符的函数体(8.4),但出于名称查找(3.4)的目的,...在lambda表达式的上下文中考虑复合语句.
毫不奇怪,本地类型应该是可见的.
| 归档时间: |
|
| 查看次数: |
2599 次 |
| 最近记录: |