任何人都可以向我解释为什么我必须在第二个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)
这是一个gcc bug.来自[expr.prim.lambda]:
所述λ-表达的化合物语句产生的功能体的函数调用操作的(8.4),但对于名称查找的目的(3.4),确定该(9.3.2)的类型和值和转化ID表达式 使用
(*this)(9.3.1)将非静态类成员引用到类成员访问表达式中,在lambda表达式的上下文中考虑复合语句.[例如:Run Code Online (Sandbox Code Playgroud)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* }; } };- 末端的例子]
在这种情况下,get()应该等同于test::get()并被this捕获,因此这是格式良好的.clang按原样编译代码.如果你改变i为a int而不是as const auto&,那么gcc会编译代码,这与get()查找方式无关.