Recibí un error extraño de gcc y no puedo entender por qué. Hice el siguiente código de ejemplo para aclarar el problema. Básicamente, hay una clase definida, para la cual hago que el constructor de copias y el operador de asignación de copias sean privados, para evitar llamarlos accidentalmente.vector :: push_back insiste en usar el constructor de copia aunque se proporciona un constructor de movimiento
#include <vector>
#include <cstdio>
using std::vector;
class branch
{
public:
int th;
private:
branch(const branch& other);
const branch& operator=(const branch& other);
public:
branch() : th(0) {}
branch(branch&& other)
{
printf("called! other.th=%d\n", other.th);
}
const branch& operator=(branch&& other)
{
printf("called! other.th=%d\n", other.th);
return (*this);
}
};
int main()
{
vector<branch> v;
branch a;
v.push_back(std::move(a));
return 0;
}
Espero que este código se compile, pero falla con gcc. En realidad, gcc se queja de que "branch :: branch (const branch &) es privada", lo cual, como entiendo, no debería llamarse.
funciona El operador de asignación, ya que si puedo reemplazar el cuerpo de main() con
branch a;
branch b;
b = a;
Será compilar y ejecutar como se esperaba.
¿Es este un comportamiento correcto de gcc? Si es así, ¿qué pasa con el código anterior? Cualquier sugerencia es útil para mí. ¡Gracias!
Funciona para mí con gcc-4.6.1. –
Estaba usando gcc 4.7.1-2. Voy a intentar 4.6.1. ¡Gracias! – BreakDS
Al leer N3242, este código debe permitirse (pero si el constructor de movimientos arroja una excepción, el programa tiene un comportamiento no definido). – aschepler