Подтвердить что ты не робот

Висячая ссылка во внутренней лямбда

У меня есть внутренняя лямбда, которая использует одну из ссылочных переменных внешней лямбды, например:

int x=0;
auto outer=[&](){
   return [&](){
        x=5;
    };
};

auto inner= outer();
inner();
std::cout << x;

I попробовал его. Он работал хорошо. Тем не менее, я хочу убедиться, что здесь нет ссылки. Есть?

4b9b3361

Ответ 1

Здесь нет ссылки. Ссылка на внутреннюю лямбду не является ссылкой на ссылку (такой вещи нет); он относится к x - который, конечно, не выходит за рамки.

Ответ 2

Как показано, вы вызываете лямбда в пределах области блока, где объявляется x, и нет никакой оборванной ссылки.

Стоит отметить, что внутренняя анонимная лямбда фиксирует ссылку на x непосредственно из области внешнего блока, а не из внешней лямбды, поскольку она ищет объявление.

Если вы передадите (копию) вашего лямбда-объекта за пределы этого блока, тогда вы можете вызвать ссылку на оборванную ссылку.

Ответ 3

Если вы переписываете код без использования lambdas, тогда я думаю, что ясно, что нет обвисшей ссылки, просто ссылка на переменную x, которая все еще находится в области видимости:

class Inner {
    int& x;
  public:
    Inner(int &x) : x(x) {}
    void operator()(){
        x = 5;
    }
};

class Outer {
    int& x;
  public:
    Outer(int &x) : x(x) {}
    Inner operator()(){
        return {x};
    }
};

int main() {
    int x=0;
    auto outer = Outer{x};
    auto inner = outer();
    inner();
    std::cout << x;
}