c++ - 静态分配对象的值初始化
问题描述
我有这样的课:
class Car {
int x;
public:
Car() {cout << "Init car" << endl;}
Car(const Car & c) { cout << "Copy car" << endl;}
Car(const Car && c) { cout << "Move car" << endl;}
};
当我想对类的对象进行值初始化时Car
:
Car c = Car();
仅调用默认构造函数。既然有赋值,为什么不调用复制构造函数或移动构造函数?
解决方案
因为复制省略,这是从 C++17 保证的。
在以下情况下,编译器必须省略类对象的复制和移动构造,即使复制/移动构造函数和析构函数具有可观察到的副作用。对象直接构建到存储中,否则它们将被复制/移动到。复制/移动构造函数不需要存在或可访问:
在对象的初始化中,当初始化表达式是与变量类型相同的类类型(忽略 cv-qualification)的纯右值时:
T f() { return T(); } T x = T(T(f())); // only one call to default constructor of T, to initialize x
PS:T x = T();
不是赋值而是初始化,更准确地说是拷贝初始化。
推荐阅读
- dictionary - How to refactor Clojure source code, especially to rename the keywords of a map collection?
- bash - scp execution fails when when executed from a script after udev rule trigger - Script works if executed manually or through cron
- html - Get Text in Span Using CSS Selector
- javascript - Resolve: "Unknown system error -86" error when installing imagemin-pngquant/imagemin-optipng on Apple Silicon (M1)
- ssis - Execute a package linked from another
- asp.net - How to perform XUnit test on a jwt authorised web api?
- apache-spark - PySpark,如何简单地计算 Kmeans 模型中每个集群的数量?
- python - 如何转置并添加具有从其中一列引用的值的新列
- excel - how to loop through a range and re-run main code recursively for parent directories
- facebook-ads-api - Facebook Marketing API - Ads billing transactions