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()();
}
< /code>
Однако следующий код плохо сформирован: < /p>
int main() {
int n = 0;
// error: invalid use of 'this' outside of a non-static member function
return [n] { return this->n; }();
}
Я думаю, что стандарт C ++ должен запретить компилятор использовать этот указатель для доступа к захваченным переменным. Тем не менее, я не могу найти точные утверждения в 7.5.6 [expr.prim.lambda] стандартного черновика C ++.
Рассмотрим следующий код: < /p> [code]int main() { int n = 0; return [n] { return n; }(); // ok } [/code] Согласно https://cppinsights.io, код выше будет переведен в следующий код: [code]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()(); } < /code> Однако следующий код плохо сформирован: < /p> int main() { int n = 0; // error: invalid use of 'this' outside of a non-static member function return [n] { return this->n; }(); } [/code] Я думаю, что стандарт C ++ должен запретить компилятор использовать этот указатель для доступа к захваченным переменным. Тем не менее, я не могу найти точные утверждения в [b] 7.5.6 [expr.prim.lambda] [/b] стандартного черновика C ++.