He probado el siguiente código:¿En qué casos es el constructor de copia llamada, si se copia un recipiente
#include <iostream>
#include <vector>
class foo {
public:
int m_data;
foo(int data) : m_data(data) {
std::cout << "parameterised constructor" << std::endl;
}
foo(const foo &other) : m_data(other.m_data) {
std::cout << "copy constructor" << std::endl;
}
};
main (int argc, char *argv[]) {
std::vector<foo> a(3, foo(3));
std::vector<foo> b(4, foo(4));
//std::vector<foo> b(3, foo(4));
std::cout << "a = b" << std::endl;
a = b;
return 0;
}
consigo
parameterised constructor
copy constructor
copy constructor
copy constructor
parameterised constructor
copy constructor
copy constructor
copy constructor
copy constructor
a = b
copy constructor
copy constructor
copy constructor
copy constructor
Sin embargo, si reemplazo std::vector<foo> b(4, foo(4));
por std::vector<foo> b(3, foo(4));
el constructor de copia no es llamado por a = b
y la salida es
parameterised constructor
copy constructor
copy constructor
copy constructor
parameterised constructor
copy constructor
copy constructor
copy constructor
a = b
¿Por qué en este caso no se llama al constructor de copia?
estoy usando g ++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
Esto es realmente extraño ... Incluso es reproducible en ideone ... – RedX
Sooo cool. :) También reproduje eso, aunque no lo creí. –
tal vez el compilador simplemente mueve b a a ya que b no se usa después de la asignación? ¿Has intentado hacer algo con b después de a = b (imprimir, etc.)? – user396672