Testowałem następujący kod:W jakich przypadkach jest konstruktor kopiujący nazwie, jeśli pojemnik jest kopiowany
#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;
}
uzyskać
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
Jednakże, jeśli mogę wymienić std::vector<foo> b(4, foo(4));
przez std::vector<foo> b(3, foo(4));
konstruktora kopia nie jest wywoływane przez a = b
, a wyjście to
parameterised constructor
copy constructor
copy constructor
copy constructor
parameterised constructor
copy constructor
copy constructor
copy constructor
a = b
Dlaczego w takim przypadku konstruktor kopiowania nie jest wywoływany?
używam g ++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
To jest naprawdę dziwne ... Jest nawet powtarzalne w idealnym ... – RedX
Sooo cool. :) Ja też to powtórzyłem, choć w to nie wierzyłem. –
może kompilator po prostu przenosi b do a, ponieważ b nie jest używane po przypisaniu? Czy próbowałeś zrobić coś za pomocą b po a = b (drukowanie, itp.)? – user396672