以下示例演示了我在VC++ 2010中遇到的问题:
class Foo
{
template<class T>
static T foo(T t) { return t; }
public:
void test()
{
auto lambda = []() { return foo(1); }; // call to Foo::foo<int>
lambda();
}
};
Run Code Online (Sandbox Code Playgroud)
VC++产生:错误C3861 'foo'::标识符未找到
如果我将调用限定为foo:Foo::foo(1);那么这个例子会编译一个警告:
警告C4573:使用'Foo::foo'需要编译器捕获'this'但是当前的默认捕获模式不允许它
该标准对此案有何评价?应该找到不合格的名字吗?合格的名称是否需要捕获this?
Microsoft 在许多案例中都发现了此问题。看:
正如您所发现的,显式解析允许它找到名称。关于此还有一个额外的警告,这也是一个编译器错误(名称解析不需要访问它,尽管我可以看到编译器实现可能需要它) - 但这是一个单独的错误。微软已经确认这是一个错误,并且显然已经为下一个版本准备了修复程序。