Почему передача временного объекта в инициализацию объекта не вызовет constrctor копирования? - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть некоторая путаница при инициализации объектов посредством прямой инициализации, передавая временные объекты ..

Вот код, который я хочу понять:

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 только два раза?

Я хочу точно знать, что происходит, также я попробовал один и тот же код без оптимизации и разных уровней, но результат один и тот же.Спасибо.

...