静态分配对象的值初始化

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)

仅调用默认构造函数。为什么没有调用复制构造函数或移动构造函数,因为存在赋值?

son*_*yao 5

由于复制省略,这是从 C++17 保证的。

在以下情况下,编译器需要省略类对象的复制和移动构造,即使复制/移动构造函数和析构函数具有可观察到的副作用。对象被直接构建到存储中,否则它们将被复制/移动到那里。复制/移动构造函数不需要存在或可访问:

  • 在对象的初始化中,当初始化表达式是与变量类型相同类类型的纯右值(忽略 cv 限定)时:

    T f() {
        return T();
    }
    
    T x = T(T(f())); // only one call to default constructor of T, to initialize x
    
    Run Code Online (Sandbox Code Playgroud)

PS:T x = T();不是赋值而是初始化,更准确地说是复制初始化