在lambda函数名称解析,抓住_this_ [关闭](Function name resoluti

2019-09-24 03:38发布

我在看下面的代码:

#include <iostream>

void f()
{
    std::cout << "Called ::f()" << std::endl;
}

struct S
{
    void f()
    {
        std::cout << "Called S::f()" << std::endl;
    }

    void oops()
    {
        [this](){ f(); }(); // calls the wrong function
    }
};

int main()
{
    S().oops();
    return 0;
}

( http://ideone.com/w7nyb )

VS2010调用::f() ,但GCC和VS2012调用S::f() 对我来说,似乎VS2012是正确的。

其功能应根据标准被称为?

Answer 1:

S::f()被调用。 C ++ 11§5.1.2/状态7:

所述λ-表达化合物语句产生的函数调用操作的功能体 ,但是对于名称查找的目的,确定的类型和值this与转化ID表达式参照非静态类成员变成类的成员访问使用表达式(*this)化合物语句λ-表达的上下文中考虑。

这里最重要的部分是“为名称查找的目的,......的复合语句lambda表达式的背景中考虑。” 既然没有f在lambda块局部声明,它抬起头来,就像它会抬起头来,如果它是从身体直接引用oops 。 因此,成员函数被发现。


需要注意的是最近的Visual C ++和GCC两个版本有正确的行为(包括Visual C ++ 2012和gcc 4.7.2)。 旧版本可能会出现,因为拉姆达规范是在2009年下半年大修不正确的行为(见n2927:对的C ++ 0x lambda表达式新的措辞 [PDF])。 请记住,之前C ++ 11定稿,该规范是一个移动的目标,和旧的编译器很可能会实现该规范的不同版本。 即使是现在,许多实施者仍在努力追赶到最终规格。



文章来源: Function name resolution in a lambda that captures _this_ [closed]