关于C++ Lambda表达式本质及捕获变量的this指针访问限制的标准条款咨询
C++ Lambda表达式本质及捕获变量的this指针访问限制的标准条款咨询
我最近在琢磨C++ Lambda的底层机制和标准规则,碰到了一个有点绕的问题,想请教下各位大佬。
先看这段合法的代码:
int main() { int n = 0; return [n] { return n; }(); // ok }
从编译器的视角来看,这段代码会被转换成类似这样的结构(相当于把Lambda转成了一个匿名 functor 类):
int main() { int n = 0; class __lambda_3_12 { public: inline /*constexpr */ int operator()() const { return n; } private: int n; public: __lambda_3_12(int& _n) : n{_n} { } } __lambda_3_12{n}; return __lambda_3_12.operator()(); }
这里Lambda捕获的变量n变成了匿名类的私有成员,operator()直接访问这个成员,完全没问题。
但如果我改成下面这样,代码就直接报错了:
int main() { int n = 0; // error: invalid use of 'this' outside of a non-static member function return [n] { return this->n; }(); }
报错信息说“在非静态成员函数外非法使用this”,我估摸着这应该是C++标准明确禁止了用this指针去访问Lambda捕获的变量,但我翻遍了标准草案里的7.5.6 [expr.prim.lambda]章节,就是找不到对应的明确条款。
有没有熟悉标准的朋友能帮我指出来,到底是哪条规则在限制这个行为呀?
内容来源于stack exchange
相关产品推荐
相关产品推荐

