从lambda调用函数时的查找规则是什么?

Gen*_*yev 6 c++ c++11

以下示例演示了我在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

ex0*_*du5 4

Microsoft 在许多案例中都发现了此问题。看:

使用 lambda 进行范围解析会干扰命名空间和类型解析

lambda 中的模板解析

正如您所发现的,显式解析允许它找到名称。关于此还有一个额外的警告,这也是一个编译器错误(名称解析不需要访问它,尽管我可以看到编译器实现可能需要它) - 但这是一个单独的错误。微软已经确认这是一个错误,并且显然已经为下一个版本准备了修复程序。