c++ - functional - Expresiones lambda
lambda c (2)
Un punto del párrafo 19.2 de la sección 5.1.2 del borrador n3290 de la ISO:
El tipo de cierre asociado con una expresión lambda tiene un constructor predeterminado eliminado (8.4.3) y un operador de asignación de copia eliminada. 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 de copiar / mover se define implícitamente de la misma manera que cualquier otro constructor de copia / movimiento declarado implícitamente se definiría implícitamente. "Nota final"
¿Alguien por favor ... puede dar algún ejemplo para que este punto lo entienda?
¿Hay alguna posibilidad / forma de verificar el objeto de cierre (tipo)?
El tipo de cierre asociado con una expresión lambda tiene un constructor predeterminado eliminado (8.4.3)
int main() {
auto closure = [](){};
typedef decltype(closure) ClosureType;
ClosureType closure2; // <-- not allowed
return 0;
}
y un operador de asignación de copia eliminada. Tiene un constructor de copia declarado implícitamente (12.8) y puede tener un constructor de movimiento declarado implícitamente (12.8).
#include <utility>
int main() {
auto closure = [](){};
typedef decltype(closure) ClosureType;
ClosureType closure2 = closure; // <-- copy constructor
ClosureType closure3 = std::move(closure); // <-- move constructor
closure2 = closure3; // <-- copy assignment (not allowed)
return 0;
}
struct LambdaExample{
// deleted operations = not allowed
LambdaExample() = delete;
LambdaExample& operator=(LambdaExample const&) = delete;
// generated by the compiler:
LambdaExample(LambdaExample const& other);
LambdaExample(LambdaExample&& other);
// anything else a lambda needs
};
Para su segunda pregunta, si quiere decir que puede ver la implementación, entonces no, no es posible. Se crea sobre la marcha por el compilador. Si quieres obtener el tipo de la lambda, seguro:
auto l = [](){};
typedef decltype(l) closure_type;