mic*_*t38 4 c++ initialization
我有这样的课:
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;}
};
Run Code Online (Sandbox Code Playgroud)
当我想对 class 的对象进行值初始化时Car:
Car c = Car();
Run Code Online (Sandbox Code Playgroud)
仅调用默认构造函数。为什么没有调用复制构造函数或移动构造函数,因为存在赋值?
由于复制省略,这是从 C++17 保证的。
在以下情况下,编译器需要省略类对象的复制和移动构造,即使复制/移动构造函数和析构函数具有可观察到的副作用。对象被直接构建到存储中,否则它们将被复制/移动到那里。复制/移动构造函数不需要存在或可访问:
在对象的初始化中,当初始化表达式是与变量类型相同类类型的纯右值(忽略 cv 限定)时:
Run Code Online (Sandbox Code Playgroud)T f() { return T(); } T x = T(T(f())); // only one call to default constructor of T, to initialize x
PS:T x = T();不是赋值而是初始化,更准确地说是复制初始化。
| 归档时间: |
|
| 查看次数: |
41 次 |
| 最近记录: |