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

Права доступа лямбда, захватывающие это

Рассмотрим следующий код:

#include <iostream>

struct test
{
    void public_test()
    {
        [this]() { private_test(); }();
    }

private:
    void private_test()
    {
        std::cout << "test\n";
    }
};

int main()
{
    test().public_test();
}

Лямбда фиксирует это, а затем вызывает частный метод захваченного объекта. Теперь этот код компилируется и работает (печатает test) с использованием VС++ 2012. В то время как это довольно интуитивное и полезное поведение, я хотел бы знать, гарантировано ли это, что он работает по стандарту. Таким образом, lambda имеет частный доступ к любому объекту, захваченному через this?

Я попытался посмотреть это в стандартном чтении через 5.1.2 [expr.prim.lambda], но не смог найти определенного ответа (не настолько хорошо разбирающегося в глубинах стандарта). Единственный абзац, который мне показался полезным, -

Тип лямбда-выражения (который также является типом закрывающий объект) является уникальным, неназванным типом типа ununion, называемым тип закрытия - свойства которого описаны ниже. Этот тип класса не является совокупностью (8.5.1). Тип закрытия объявляется в наименьший объем блока, класс или область пространства имен, которая содержит соответствующее лямбда-выражение. [Примечание: это определяет набор пространств имен и классов, связанных с типом замыкания (3.4.2). Типы параметров лямбда-декларатора не влияют на эти связанных пространств имен и классов. -end note]

Но с другой стороны нормальный тип локального класса, определенный в функции-члене, не имеет частного доступа к окружающему классу. Таким образом, лямбда, имеющая частный доступ, каким-то образом повысила бы лямбды над простым синтаксическим сахаром для локального функционального объекта к чему-то более вовлеченному, так как для этого потребуется дополнительная "магия компилятора", чтобы каким-то образом сделать ее другом окружающего класса.

Так что лямбда имеет частный доступ к любому объекту, захваченному через this, и если да, какие части стандарта позволяют это сделать?

4b9b3361

Ответ 1

Я не думаю, что факт, что это лямбда, имеет значение. Все лямбда определяет локальный класс. И согласно § 11/2: "Локальный класс функция-член может получить доступ к тем же именам, что и функция-член сам может получить доступ ".