【发布时间】:2014-02-02 19:28:34
【问题描述】:
考虑以下代码:
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-use 都将转换为对闭包类型的相应未命名数据成员的访问,[...]
据我了解,这意味着在与this 指针对应的闭包类型中必须有一个未命名的数据成员。但是由于this 是通过引用捕获,因此标准不要求存在这样的成员。我怎么了?
【问题讨论】: