que functional funcion c++ c++11 lambda move-semantics

c++ - functional - que es lambda expression



¿Por qué no se llama al constructor de movimientos cuando se mueve en un lambda? (1)

El problema aquí es que el operator() del tipo de clase anónimo que lambda representa es const por defecto. Eso significa que no puedes moverte de p2_1 ya que this de la lambda es const& en la función. Lo que necesitas hacer es usar la palabra clave mutable como

int main() { C2 p2; ([p2_1{ std::move(p2) }]() mutable { auto p2_2 = std::move(p2_1); // <--- })(); return 0; }

Lo que hace que la función no sea constante, lo que a su vez significa que puedes mutar sus miembros. Esto le permite mover p2_1 lugar de intentar copiarlo.

Estoy tratando de compilar el siguiente código:

#include <utility> struct C2 { C2() = default; C2(C2 const&) = delete; C2(C2&&) = default; }; int main() { C2 p2; ([p2_1{ std::move(p2) }]() { auto p2_2 = std::move(p2_1); // <--- })(); return 0; }

Sin embargo, esto no compila y da un error de que la asignación a p2_2 está llamando a una función eliminada, a saber, el constructor de copia. Tenga en cuenta que el movimiento a p2_1 está bien. ¿Por qué no está usando el constructor de movimiento?