c++ - programacion - Derechos de acceso de un lambda que capture esto.
lambda sintaxis (1)
Considere el siguiente código:
#include <iostream>
struct test
{
void public_test()
{
[this]() { private_test(); }();
}
private:
void private_test()
{
std::cout << "test/n";
}
};
int main()
{
test().public_test();
}
La lambda captura esto y luego llama a un método privado del objeto capturado. Ahora este código compila y funciona (imprime la test
) usando VC ++ 2012. Si bien este es un comportamiento bastante intuitivo y útil, me gustaría saber si está garantizado que funcione de manera estándar. Por lo tanto, ¿un lambda tiene acceso privado a algún objeto capturado a través de this
?
Traté de buscar esto en la lectura estándar a través de 5.1.2 [expr.prim.lambda] pero realmente no pude encontrar una respuesta definitiva (no está tan versado en las profundidades de la norma). El único párrafo que me pareció útil es
El tipo de la expresión lambda (que también es el tipo del objeto de cierre) es un tipo de clase sin unión único y sin nombre, denominado tipo de cierre, cuyas propiedades se describen a continuación. Este tipo de clase no es un agregado (8.5.1). El tipo de cierre se declara en el ámbito de bloque más pequeño, el ámbito de clase o el ámbito de espacio de nombres que contiene la expresión lambda correspondiente. [Nota: Esto determina el conjunto de espacios de nombres y clases asociadas con el tipo de cierre (3.4.2). Los tipos de parámetros de un lambda-declarator no afectan estos espacios de nombres y clases asociados. "Nota final"
Pero, por otro lado, un tipo de clase local normal definido en una función miembro no tiene acceso privado a la clase circundante. Por lo tanto, un lambda que tenga acceso privado elevaría de alguna manera a los lambdas por encima del mero azúcar sintáctico para un objeto de función local a algo más complicado, ya que necesitaría "magia de compilación" adicional para convertirlo en un amigo de la clase circundante.
Entonces, ¿un lambda tiene acceso privado a cualquier objeto capturado a través de this
y, en caso afirmativo, qué partes de la norma permiten que esto suceda?
No creo que el hecho de que sea un lambda sea relevante. Todo lo que hace lambda es definir una clase local. Y de acuerdo con §11 / 2: "Una clase local de una función miembro puede acceder a los mismos nombres a los que la función miembro puede acceder".