为什么'这个'尽管捕捉到了一切,

时间:2016-04-07 14:52:05

标签: c++ c++14

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

完整性的错误消息:

  

无法调用成员函数' 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()();
}

Godbolt

1 个答案:

答案 0 :(得分:9)

这是一个gcc错误。来自[expr.prim.lambda]:

  

lambda-expression 复合语句产生函数调用运算符的 function-body (8.4),但是用于目的名称查找(3.4),确定此类型和值(9.3.2)并转换 id-expressions   使用(*this)(9.3.1)将非静态类成员引用到类成员访问表达式中,复合语句 lambda-expression 的上下文中被考虑EM>。 [例如:

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*
        };
    }
};
     

-end example]

在这种情况下,get()应该等同于test::get(),并且会捕获this,因此格式正确。 clang按原样编译代码。如果您将i更改为int而不是const auto&,则gcc会编译代码,这与get()的查找方式无关。