Я играю с несколькими вещами, чтобы понять, как работают конструкторы копирования. Но я не могу понять, почему конструктор копирования вызывается дважды для создания x2
. Я бы предположил, что он будет вызван один раз, когда возвращаемое значение createX()
копируется в x2
.
Я также рассмотрел несколько связанных вопросов по SO, но, насколько я могу судить, я не смог найти тот же простой сценарий, который я задаю здесь.
Кстати, я -fno-elide-constructors
с -fno-elide-constructors
, чтобы увидеть, что происходит без оптимизации.
#include <iostream>
struct X {
int i{2};
X() {
std::cout << "default constructor called" << std::endl;
}
X(const X& other) {
std::cout << "copy constructor called" << std::endl;
}
};
X createX() {
X x;
std::cout << "created x on the stack" << std::endl;
return x;
}
int main() {
X x1;
std::cout << "created x1" << std::endl;
std::cout << "x1: " << x1.i << std::endl << std::endl;
X x2 = createX();
std::cout << "created x2" << std::endl;
std::cout << "x2: " << x2.i << std::endl;
return 0;
}
Это вывод:
default constructor called
created x1
x1: 2
default constructor called
created x on the stack
copy constructor called
copy constructor called
created x2
x2: 2
Может ли кто-нибудь помочь мне, что я пропускаю или пропускаю здесь?