2011-05-31 19 views
17

Un punto de proyecto ISO n3290 sección 5.1.2 párrafo, punto 19:Lambda Expresiones

El tipo de cierre asociado con un lambda-expresión tiene un borrado (8.4.3) constructor predeterminado y una operador de asignación de copias eliminado Es tiene un constructor de copia implícitamente declarado (12.8) y puede tener un constructor de movimiento implícitamente declarado (12.8). [Nota: El constructor copiar/mover se define implícitamente en de la misma manera que cualquier otro implícitamente constructor de copia/movimiento declarado sería implícitamente definido. -finalizar nota]

¿Puede alguien por favor ... dar un ejemplo para que este punto lo entienda?

¿Hay alguna posibilidad/forma de verificar el objeto Closure (tipo)?

Respuesta

30

El tipo de cierre asociado con un lambda-expresión tiene un borrado constructor (8.4.3) de forma predeterminada

int main() { 
    auto closure = [](){}; 
    typedef decltype(closure) ClosureType; 

    ClosureType closure2; // <-- not allowed 

    return 0; 
} 

y un operador de asignación de copia eliminado. Tiene un constructor de copia implícitamente declarado (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; 
} 
+0

+1. Estaba a punto de publicar eso. Pero ya hiciste eso. – Nawaz

+0

Gracias por su respuesta. ¿Hay alguna manera/oportunidad de explicar ... este punto ... en términos de una clase Ejemplo – user751747

+0

@ usuario: ¿Qué punto? ¿Y a qué te refieres con "Ejemplo de clase"? – kennytm

4
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 
}; 

a su segunda pregunta, si usted quiere decir que se puede mirar en la puesta en práctica, a continuación, pues no, no es posible. Fue creado sobre la marcha por el compilador. Si quiere obtener el tipo de lambda, seguro:

auto l = [](){}; 
typedef decltype(l) closure_type; 
+0

sí, el compilador crea el tipo obj de cierre sobre la marcha. ¿Hay alguna posibilidad de que se compruebe si existe o no? – user751747

+0

@usuario: ¿Qué quiere decir con "existe"? – Xeo