我遇到一个奇怪的问题。以下简化码的再现的问题在MSVC2010年:

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; };
}

我没有克++可供测试,现在。这是一些奇怪的规则在C++0x,或者只是一个错误的编译器吗?

从结果上面,我倾向的错误。虽然崩溃,绝对是一个错误。


现在,我已提交两个 bug reports.

所有代码段上应该编译。错误具有与使用的范围号决议在本地定义的范围。(斑点 dvide.)

和崩溃的错误做...谁知道。:)


更新

根据 bug reports, 他们都被固定为下一个版本的Visual Studio2010年。(虽然这似乎不是这种情况;VS11也许吧。)

有帮助吗?

解决方案

从N3000,5.1.2 / 6,

  

在λ-表达的   化合物语句的产率   功能的功能体(8.4)   调用operator,但目的   名称查找(3.4),...的   复合语句在考虑   所述λ-表达的上下文中。

毫不奇怪,局部类型应该是可见的。

其他提示

功能本地枚举不能由任一lambda表达式检测

int main()
{   
    enum E {A, B, C};   
    auto x = [](){ int a = A; }; 
    //auto y = [](){ E a = A; }; // this will crash the compiler
}

错误C3493:“A”不能隐因为没有指定缺省捕获模式中捕获

以下是一个workround,有问题的,也许虽然。

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

这是不是一个真正的回答你的问题,而只是进一步探讨的问题。我在想,如果编译器有一个处理问题的类型的在一个封闭的范围内声明的,所以尝试了这一点:

#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> ();
}

在这里,我只是想创建封闭范围内的本地类型,并从lambda函数中使用它。这不仅不能编译(与Visual Studio 2010 Beta 2中),但它实际上崩溃了C1001内部错误的编译器。

我已提交两个错误报告。

我们将看到它如何去。:)


更新

两个错误都已标记为固定:

我们赞赏你的反馈意见。这个错误已经看到,通过我们面前的和我们有固定它在下一个版本。感谢您使用的产品。

谢谢,
Ulzii Luvsanbat
Windows C++的团队

所以我们去。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top