此指针在 lambda 捕获(按引用)中
this pointer in lambda-capture by reference
struct CL
{
int i;
void fnc()
{
[&this](){i=1;}; // (1) error
[&](){i=1;}; // (2) ok
}
};
这是第一种情况不起作用,但第二种情况起作用。为什么?
我看到标准 5.1.2/1:
捕获:
标识符
和标识符
这
(即 &这不存在)
和 5.1.2/15:
如果实体是隐式或显式的,则通过引用捕获该实体 捕获但未通过副本捕获
在第二种情况下,"this"不会根据 5.1.2/14 被复制捕获:
如果实体被隐式捕获,并且 捕获默认值为 = 或者如果它被捕获显式捕获 不包括 &
但是如何按值显式捕获"此"指针呢?或者是否只能隐式地使用默认捕获和?
从形式上讲,[&]
确实通过引用捕获this
,根据 5.1.2/16"如果一个实体被隐式或显式捕获但未被复制捕获,则通过引用捕获实体。但这并不重要,因为
5.1.2/18 ...如果捕获
this
,则this
的每个 odr 使用都将转换为对闭包类型的相应未命名数据成员的访问,将 (5.4) 转换为this
类型。[注意:强制转换确保转换后的表达式是 prvalue。
所以对于this
,按拷贝捕获和按引用捕获是无法区分的。出于所有实际目的,this
始终通过副本捕获。
相关文章:
- c++ lambda:柯里和函数:使用按值捕获与按引用捕获返回不同的结果
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 修改在 std::future 的 lambda 中引用捕获的值
- 仅通过引用捕获的 lambda 表达式是否保证不会抛出?
- 无法通过引用捕获 lambda 中的成员变量
- 为什么访问我的引用捕获变量会导致我的 lambda 函数出现段错误?
- 我无法通过引用捕获传递 lambda
- 为什么标准不允许通过引用捕获不完整的异常类型?
- 通过引用捕获与移动,lambdas
- 在 lambda 中通过引用捕获thread_local变量无法按预期工作
- lambda 表达式中引用捕获的 constexpr 变量和非显式捕获的 constexpr 变量之间的区别
- 列出生成器(lambda的向量)会导致通过引用捕获的非常奇怪的行为
- 在标准算法中,通过引用捕获更正确
- 包含通过引用捕获的 lambda 函数的"variable"的类型是什么?
- 是按值抛出和按引用捕获的经验法则
- 从函数返回 lambda 并传入引用捕获
- 在C++11 lambda中通过引用捕获静态变量
- 为什么 GCC 允许通过右值引用捕获
- C++11通过引用捕获的lambdas一般是可破坏的
- 替代具有引用捕获的函数指针