尽管抓住了一切,为什么"这个"是必要的

use*_*963 7 c++ c++14

任何人都可以向我解释为什么我必须在第二个lambda中明确写出"this->",即使我捕获了一切?

完整性的错误消息:

无法在没有对象的情况下调用成员函数'result_t test :: get()'

#include <iostream>
#include <functional>
#include <algorithm>
#include <vector>

using result_t = std::function<void()>;

struct test
{
    bool noMore = false;

    result_t get()
    {
        return [this]
        {
            std::vector<int> vec;
            vec.push_back(1);
            vec.push_back(2);
            vec.push_back(3);

            if(not noMore)
            {
                noMore = true;

                std::for_each(vec.begin(), vec.end(),
                    [&](const auto& i)
                    {
                        auto value1 = this->get(); // compiles
                        auto value2 = get(); // error
                    });
            }
        };
    }
};

int main() {
    test t;
    t.get()();
}
Run Code Online (Sandbox Code Playgroud)

Godbolt

Bar*_*rry 9

这是一个gcc bug.来自[expr.prim.lambda]:

所述λ-表达化合物语句产生的功能体的函数调用操作的(8.4),但对于名称查找的目的(3.4),确定该(9.3.2)的类型和值和转化ID表达式 使用(*this)(9.3.1)将非静态类成员引用到类成员访问表达式中,在lambda表达式的上下文中考虑复合语句.[例如:

struct S1 {
    int x, y;
    int operator()(int);
    void f() {
        [=]()->int {
            return operator()(this->x + y); // equivalent to S1::operator()(this->x + (*this).y)
                                            // this has type S1*
        };
    }
};
Run Code Online (Sandbox Code Playgroud)

- 末端的例子]

在这种情况下,get()应该等同于test::get()并被this捕获,因此这是格式良好的.clang按原样编译代码.如果你改变i为a int而不是as const auto&,那么gcc会编译代码,这与get()查找方式无关.