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?