Рассмотрим следующий код:
#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
, и если да, какие части стандарта позволяют это сделать?