c++ - C++ 对象构造——直接初始化与使用“=”操作符,它们是等价的吗?
问题描述
在 C++ 中,这两种初始化类对象的方式在功能上是等效的,还是在某些情况下它们可能具有不同的语义并生成不同的代码?
SomeClass foo(1,2,3);
对比
auto foo = SomeClass(1,2,3);
解决方案
第一个是直接初始化。
第二个是拷贝初始化,概念foo
上是从直接初始化的临时拷贝初始化SomeClass
。(顺便说一句,它与 无关operator=
;它是初始化但不是赋值。)
由于强制复制省略(自 C++17 起),它们具有完全相同的效果,对象由适当的构造函数直接初始化。
在对象的初始化中,当初始化表达式是与变量类型相同的类类型(忽略cv-qualification )的纯右值时:
T x = T(T(f())); // only one call to default constructor of T, to initialize x
在 C++17 之前,复制省略是一种优化;即使复制/移动构造可能被省略,适当的复制/移动构造函数也必须可用;如果不是(例如,构造函数被标记为explicit
),则第 2 种样式将不起作用,而第 1 种样式很好。
这是一种优化:即使它发生并且
/move (since C++11)
没有调用复制构造函数,它仍然必须存在且可访问(好像根本没有发生优化),否则程序是错误的:
推荐阅读
- css - 为什么设置 dialogClassName 并使用 Styled JSX 设置 Bootstrap 模式的样式需要全局标记?
- javascript - 是否可以为多个实例重用 flatpickr 窗格的 DOM?
- firemonkey - 为什么 tmediaplayer.CurrentTime 不适用于 Android?
- google-cloud-sql - Gcloud SQL 升级 postgres 9.6 到 11
- r - 如何修复 var(X) 现已失效
- php - 如何在 MySQL Select 查询中使用变量
- javascript - 对象过滤并根据我的喜好重新排列顺序
- react-native - 当 React Native 中的文本溢出时,是否有任何方法可以覆盖 iOS TextInput 默认的省略号行为?
- r - 将数据帧拆分为具有不等长度向量的列表
- javascript - 如何将 React 道具从父母传递给孩子,再传递给另一个孩子?