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

时间:2011-09-02 08:00:43

标签: 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();
    }
};

VC ++产生:错误C3861:'foo':未找到标识符

如果我将调用限定为foo:Foo::foo(1);,则此示例将编译并发出警告: 警告C4573:'Foo::foo'的使用要求编译器捕获'this',但当前的默认捕获模式不允许

标准对此案有何评价?应该找到不合格的名字吗?合格的名称是否需要捕获this

2 个答案:

答案 0 :(得分:4)

Microsoft已经在许多情况下报告了此问题。参见:

Scope Resolution with lambdas interferes with namespace and type resolution

Template resolution in lambdas

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

答案 1 :(得分:2)

以下编译正常。在我看来,这只是一个带模板的VS错误。

struct Foo {
    static void foo() {}
    void bar() {
        auto f = []() { foo(); };
        f();
    }
};