这个指针是如何被捕获的
How is the this pointer captured?
考虑以下代码:
struct S
{
int x;
void f()
{
auto l = [&](){ x = 42; }; //this is implicitly captured here
}
};
§5.1.2/14规定:
如果实体是隐式捕获的,并且捕获默认值为=,或者如果实体是用不包括&的捕获显式捕获的;。
因此,我得出结论,this
不是通过复制捕获的。但根据§5.1.2/15:
如果实体是隐式或显式捕获的,但不是通过复制捕获的,则通过引用捕获实体。未指定是否在通过引用捕获的实体的闭包类型中声明其他未命名的非静态数据成员。
this
通过引用捕获。但现在§5.1.2/17规定:
[…]如果捕获了
this
,则this
的每个odr使用都转换为对闭包类型的相应未命名数据成员的访问,[…]
据我所知,这意味着在对应于this
指针的闭包类型中必须有一个未命名的数据成员。但由于this
是通过引用捕获的,因此标准不要求存在这样的成员。我做错了什么?
标准在明确方面做得很差,但this
只能通过复制捕获。它不可能被左值引用捕获,因为this
是C++11§9.3.2/1中的右值。
请注意,该标准禁止通过引用显式捕获this
,因为(a)语法不允许在捕获列表中捕获&this
,因为this
在词汇上是关键字,而不是标识符,以及(b)5.1.2/8禁止在捕获默认值为=
时显式捕获this
。
当捕获默认值为&
时,可以隐式捕获this
,这似乎是规范中的一个错误,表明它是通过引用捕获的。
我认为您发现了一个规范错误-this
是通过引用捕获的,这是正确的,但您在§5.1.2/17中找到的文本仅适用于this
是通过复制捕获的。
然而,正如Casey所说,通过引用来捕获this
并没有多大意义。
当然,闭包类型中存在这样的数据成员。按值捕获和按引用捕获都需要闭包类型中的数据成员。唯一的问题是它的类型:
T /* maybe const and/or volatile */ * captured_this;
与
T /* maybe const and/or volatile */ * const & captured_this;
由于this
永远不会改变,所以两者之间没有明显的差异。
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错