为什么尽管捕获了所有内容'this'但仍然有必要
Why is 'this' necessary despite capturing everything
有人能向我解释为什么即使我捕获了所有内容,我也必须在第二个lambda中显式写入"this->"吗?
完整性的错误消息:
在没有对象的情况下无法调用成员函数"result_ttest::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
这是一个gcc错误。来自[expr.prim.lambda]:
lambda表达式的复合语句生成函数调用运算符的function body(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* }; } };
-结束示例]
在这种情况下,get()
应该等效于test::get()
,并且this
被捕获,所以这是良好形成的。clang按原样编译代码。如果将i
更改为int
而不是const auto&
传递,则gcc会编译代码,这与get()
的查找方式无关。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 为什么成员函数内的"this"指针为空?
- 为什么我需要在转换构造函数上引用 this->?
- 为什么调试器引发"read access violation. this was nullptr"异常?
- 为什么在通过引用返回运算符分配时取消引用'this'指针?
- 从 std::ostream 重载 << 运算符时,为什么编译器会给出"too many parameters for this operator function"错误?
- 为什么程序显示我"was not declared in this scope"?
- 为什么我会收到此警告? "Member 'x' was not initialized in this constructor"
- 为什么使用指向函数的指针调用虚函数时不需要指针"this"?
- 为什么直接传递"this"指针来存档是一个错误,而另一个相同类型的指针是可以的?
- 我遇到了一些C++代码.为什么我们必须在块中使用 *this 而不是这个
- 为什么 gcc 7.3 接受静态定义中的'this'?
- 为什么有必要将"this"指针作为"arg"参数传递给pthread_create
- 为什么我的重载运算符+在向自身添加变量时会在返回时使"this"未初始化?
- C++:为什么'this'不能成为 nullptr?
- 为什么我不能std :: partition this std :: unordered_map
- 为什么我们在重载赋值中使用return*this
- 为什么我不能将"->"与"this"和"[ ]"一起使用?
- 为什么我们要"this"指针传递给setupUi 函数?
- 为什么“删除*this”会编译