为什么不将临时对象传递给对象初始化调用复制constrctor?

Ada*_*enz 6 c++ oop constructor initialization

通过直接初始化传递临时对象来初始化对象时我有些困惑.

这是我想要了解的代码:

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;
}
Run Code Online (Sandbox Code Playgroud)
  • 如上所示,在第一次调用中就可以了.它创建一个调用默认构造函数的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两次?

我想知道究竟发生了什么,我也尝试了相同的代码,没有优化和不同的级别,但结果是一样的.谢谢.