Comprender cómo el tipo de cierre Lambda ha eliminado el constructor predeterminado
De 5.1.2
[19] El tipo de cierre asociado con una expresión lambdatiene un constructor predeterminado eliminado (8.4.3) y un operador de asignación de copia eliminado. Tiene un constructor de copia declarado implícitamente (12.8) y puede tener un constructor de movimiento declarado implícitamente (12.8). [Nota: El constructor copiar / mover se define implícitamente de la misma manera que cualquier otro constructor copia / mover declarado implícitamente se definiría implícitamente. —Nota final]
Estoy leyendo C ++ Primer 14.8.1 que explica las expresiones lambda que el compilador traduce a un objeto sin nombre de una clase sin nombre. ¿Cómo puedo definir objetos de funciones lambda que no contengan una captura lambda, si se elimina el constructor predeterminado?
auto g = [](){};
¿No es conceptualmente lo mismo que ...
class lambdaClass{
public:
lambdaClass() = delete;
lambdaClass& operator=(const lambdaClass&) = delete;
void operator()(){ }
//copy/move constructor and destructor implicitly defined
};
auto g = lambdaClass(); //would be an error since default is deleted.
Si hubo una captura, entonces un constructorotro se definiría el constructor predeterminado y estaría bien inicializar objetos de este tipo (siempre que se pasara un parámetro). Pero si no hay captura y se elimina el constructor predeterminado, no parece coherente conceptualmente que se pueda crear un objeto de clase lambda.
Editar: Hmm, tal vez la concepción de que la clase lambda crea constructores dependiendo de sus capturas lambda carece de fundamento a pesar de que así se describe en C ++ Primer (no puedo encontrar ninguna cita en el estándar), porque el siguiente código no funciona incluso aunque esperaría que conceptualmente:
int sz = 2;
auto a = [sz](){ return sz;};
decltype(a) b(10); //compiler error
decltype(a) b = a; //all good though