Почему переменные-члены захватываются "автоматически", но не явным именем? - программирование
Подтвердить что ты не робот

Почему переменные-члены захватываются "автоматически", но не явным именем?

В С++ 11 (cppreference.com):

[&] фиксирует все автоматические переменные, используемые в теле лямбда по ссылке и текущему объекту по ссылке, если существует

А также...

[a, & b], где a захватывается копией и b захватывается ссылкой

Поэтому мой вопрос: если у нас есть класс, такой как (ВЕРСИЯ А):

class Foo
{
    public:

    void test()
    {
        auto y = [&](){ return x; }();   // Line 6
    }

    int x;    
};

В строке 6 мы успешно фиксируем переменную-член x используя спецификатор захвата "все автоматические переменные по ссылке".

Или мы можем написать (ВЕРСИЯ B):

{
    int& x = this->x;
    auto y = [&x](){ return x; }();
}

Но следующее не компилируется (VERSION C):

{
    auto y = [&x](){ return x; }();
}

Это связано с тем, что x не существует как имя в охватывающей области.

Это также не компилируется (VERSION D):

{
    auto y = [&this](){ return x; }();
}

Это связано с тем, что this невозможно зафиксировать по ссылке.

Итак, мой вопрос: почему работает VERSION A, а не VERSION C или VERSION D? Я понимаю, почему VERSION C и D не работают, но я не понимаю, почему работает A.

Если мы не можем зафиксировать this по ссылке, и мы не сможем захватить переменные, не входящие в родительскую область, как x записывается в VERSION A?

Интуитивно, согласно правилам захвата, VERSION B - единственная версия, которую я ожидал бы работать.

4b9b3361

Ответ 1

Версия A работает, потому что *this неявно зафиксировано ссылкой.

Текущий объект (* this) может быть неявно зафиксирован, если присутствует по умолчанию захват.

Когда вы указываете захват по умолчанию (в этом случае [&]), *this неявно захватывается; который имеет тот же эффект, что и [this]. Обратите внимание, что то, что зафиксировано ссылкой, - *this, а не само this; this не может быть записано явно по ссылке, например [&this], поэтому версия D терпит неудачу.