是的功能本地typedef内部可见C++0x lambda?
-
22-09-2019 - |
题
我遇到一个奇怪的问题。以下简化码的再现的问题在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内部错误的编译器。
不隶属于 StackOverflow