C++ 函数本地typedef在C+内可见吗+;兰巴斯?

C++ 函数本地typedef在C+内可见吗+;兰巴斯?,c++,lambda,c++11,compiler-bug,C++,Lambda,C++11,Compiler Bug,我遇到了一个奇怪的问题。以下简化代码再现了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 = []{ b

我遇到了一个奇怪的问题。以下简化代码再现了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
}
我现在没有可用的g++来测试它。这是C++0x中的一些奇怪规则,还是编译器中的一个bug

从上面的结果来看,我倾向于bug。虽然这次坠机肯定是个错误


目前,我已经提交了两份

上面的所有代码片段都应该编译。该错误与在本地定义的作用域上使用作用域解析有关。(被人发现。)

而崩溃bug与。。。谁知道呢


更新
根据,它们都已在VisualStudio2010的下一版本中修复。(虽然情况似乎并非如此;可能是VS11。)

这并不是对你问题的真正回答,只是进一步探讨了这个问题。我想知道编译器在处理封闭作用域中声明的类型时是否有问题,因此尝试了以下方法:

#include <iostream>

template <typename Func>
void do_test(Func pFunc) {
}

template <typename T>
void test_trait(void) {
   class Something { public: int foo; };

   do_test ([] (T pX) {
      Something A; A.foo = 12;
   });
}

int main(void) {
    test_trait<int> ();
}
#包括
模板
无效do_测试(Func pFunc){
}
模板
无效测试特性(无效){
类某物{public:intfoo;};
do_测试([](T pX){
某物A;A.foo=12;
});
}
内部主(空){
测试_性状();
}
这里,我只是尝试在封闭范围内创建一个本地类型,并在lambda函数中使用它。这不仅不会编译(使用VisualStudio2010,Beta 2),而且会导致编译器崩溃,并出现C1001内部错误

从n3000,5.1.2/6

lambda表达式的 复合语句生成 函数的函数体(8.4) 呼叫接线员,但出于以下目的: 名称查找(3.4) 复合语句在 lambda表达式的上下文


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

我已经提交了两个bug报告

  • 飞机坠毁了。()
  • lambda范围解析错误。()
我们来看看情况如何。:)


更新 这两个错误都已标记为已修复:

我们感谢您的反馈。我们以前见过这个bug,我们已经在下一个版本中修复了它。感谢您使用本产品

谢谢,
乌尔齐伊·卢夫桑巴特
Windows C++团队


好了。lambdas也无法检测函数本地枚举

int main()
{   
    enum E {A, B, C};   
    auto x = [](){ int a = A; }; 
    //auto y = [](){ E a = A; }; // this will crash the compiler
}
错误C3493:无法隐式捕获“A”,因为未指定默认捕获模式

下面是一个解决方案,但可能有问题

int main()
{   
    enum E {A, B, C};   
    auto x = [=](){ int a = A; };
    // typedef E F; 
    // auto y = [=](){ F a = A; }; // this compiles ok
}

与本地命名空间别名一样,所有三个测试用例都使用英特尔C++编译器11.成功编译,所有三个测试用例都使用G+4.4.5成功编译,它似乎不与模板相关,但只要需要范围解析运算符(::)。非静态foo方法按预期工作。名称空间问题是什么?它使用
::
获取原始名称空间(工作版本)。可能是在本地定义需要
?@dvide:没问题。:)使用背面的记号:`code goes here`变成
code goes here
。(注意,您可以用反斜杠转义。)我正在修改第二个报告以匹配我们的数据。@dvide:我已将“模板的typedef”错误修改为更通用的“Lambda作用域解析使用本地定义的作用域失败”。很好的发现。@James@dvide:根据错误报告,这两个问题都已解决。奇怪的是,如果您对本地类型进行本地typedef,崩溃就会消失。啊,我刚刚意识到我无意中看到了一个旧的草稿。我接受这个问题是为了回答我原来的“这是允许的”问题。:)
int main()
{   
    enum E {A, B, C};   
    auto x = [=](){ int a = A; };
    // typedef E F; 
    // auto y = [=](){ F a = A; }; // this compiles ok
}