任何人都可以向我解释为什么我必须明确写出" 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()();
}
答案 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()
的查找方式无关。