函数本地typedef在C++ 0x lambdas中是否可见?

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.)

Pot*_*ter 9

从n3000,5.1.2/6,

lambda-expression的复合语句产生函数调用操作符的函数体(8.4),但出于名称查找(3.4)的目的,...在lambda表达式的上下文中考虑复合语句.

毫不奇怪,本地类型应该是可见的.