У меня есть некоторая путаница при инициализации объектов посредством прямой инициализации, передавая временные объекты ..
Вот код, который я хочу понять:
class Foo {
public:
Foo() { cout << "ctor()\n"; }
Foo(int) { cout << "ctor(int)\n"; }
Foo(const Foo&) { cout << "cpy-ctor\n"; }
Foo& operator=(const Foo&) { cout << "copy-assignment\n"; return *this; }
};
int main() {
Foo();// ctor (temporary object). it is not a function prototype because it requires a return type.
cout << endl;
Foo f; // ctor()
cout << endl;
Foo f2(Foo(7)); // ctor only once
cout << endl;
Foo f3(Foo(Foo(7))); // ctor(int), cpy-ctor() only once
cout << endl;
Foo f4(Foo(Foo(Foo(7)))); // ctor(int), cpy-ctor() only once
cout << endl;
Foo f5(Foo(Foo(Foo(Foo(7))))); // ctor(int), cpy-ctor(), cpy-ctor
cout << endl;
}
- Как вы можете видеть вышеВо время первого звонка все в порядке.Он создает объект rvalue, вызывающий конструктор по умолчанию.Поскольку он не предоставляет возвращаемый тип, компилятор легко воспринимает его как объявление объекта.
Foo();
.
Ничего нового во втором вызове Foo f;
, который вызывает ctor по умолчанию.
- Меня смущает третий вызов:
Foo(Foo(7))
Я думал, что компилятор создаст временный объект, а затем передаст его конструктору копирования для создания объекта f2
, но он вызывает только конструктор с одним аргументом Foo(int)
.
Означает ли это, что компиляторприменяется некоторая оптимизация для удаления ненужных копий?
Теперь в Foo f3(Foo(Foo(7)));
он вызывает ctor и cpy-ctor, но почему?То же самое для f4
, хотя и отличается?
Наконец Foo f5(Foo(Foo(Foo(Foo(7)))));
вызывает ctor один раз, а cpy-ctor только два раза?
Я хочу точно знать, что происходит, также я попробовал один и тот же код без оптимизации и разных уровней, но результат один и тот же.Спасибо.