Tworzę klasę typu łańcuchowego, na przykład mały przykład poniżej. Wydaje się, że przy łączeniu funkcji składowych wywoływany jest konstruktor kopiowania. Czy istnieje sposób na pozbycie się wywołania konstruktora kopiowania? W moim poniższym przykładzie z zabawkami oczywiste jest, że mam do czynienia tylko z tymczasowymi, dlatego też „powinien” (może nie według standardów, ale logicznie) być elitarny. Drugim najlepszym wyborem, aby skopiować elision, byłoby wywołanie konstruktora ruchu, ale tak nie jest.
class test_class {
private:
int i = 5;
public:
test_class(int i) : i(i) {}
test_class(const test_class& t) {
i = t.i;
std::cout << "Copy constructor"<< std::endl;
}
test_class(test_class&& t) {
i = t.i;
std::cout << "Move constructor"<< std::endl;
}
auto& increment(){
i++;
return *this;
}
};
int main()
{
//test_class a{7};
//does not call copy constructor
auto b = test_class{7};
//calls copy constructor
auto b2 = test_class{7}.increment();
return 0;
}
Edycja: Kilka wyjaśnień. 1. Nie zależy to od poziomu optymalizacji. 2. W moim prawdziwym kodzie mam bardziej złożone obiekty (np. Przydzielone sterty) niż ints
auto b = test_class{7};
nie wywołuje konstruktora kopiowania, ponieważ jest tak naprawdę równoważny, test_class b{7};
a kompilatory są wystarczająco inteligentne, aby rozpoznać ten przypadek i dlatego mogą z łatwością uniknąć kopiowania. Tego samego nie można zrobić b2
.
std::cout
) w swoim kreatorze kopiowania? Bez tego kopia powinna zostać zoptymalizowana.