C++ 函数本地typedef在C+内可见吗+;兰巴斯?
我遇到了一个奇怪的问题。以下简化代码再现了MSVC 2010中的问题: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
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
}