对于通过直接初始化传递临时对象来初始化对象,我有些困惑。
这是我想理解的代码:
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;
}
Foo();
。调用默认ctor的第二个调用Foo f;
中没有新内容。
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吗?
我想知道到底发生了什么,我也尝试了相同的代码,但没有进行优化,但级别不同,但结果是相同的。谢谢。