c++ - 为什么不将临时对象传递给对象初始化调用复制构造函数?
问题描述
我对通过直接初始化传递临时对象来初始化对象有些困惑。
这是我想理解的代码:
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();
.
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?
我想知道到底发生了什么,我也尝试了相同的代码,没有优化和不同的级别,但结果是一样的。谢谢你。
解决方案
推荐阅读
- mysql - 我无法在 ubuntu 18.04 上安装 mysql
- reactjs - Redux 状态更改不会重新渲染数据表
- javascript - Vue Now UI Kit 中组件内的反应性
- arrays - 从 Racket 中的列表列表中获取具有最大值的列表
- php - 使用 PHP 运行查询时出现 SQL 脚本错误
- php - 用户控制器中的 Laravel '未定义变量:'
- c++ - 为 int 数组获取不一致的堆损坏 - C++
- ssh - Bitvise SH 客户端安装错误。CreateDirectory() 失败:Windows 错误 5:访问被拒绝
- javascript - 如何禁用滑动滑块中的拖动
- javascript - 在 JavaScript 中,您可以从 ForEach 循环内部将数组推送到外部变量吗?它不工作