首页 > 解决方案 > 静态分配对象的值初始化

问题描述

我有这样的课:

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++initialization

解决方案


因为复制省略,这是从 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();不是赋值而是初始化,更准确地说是拷贝初始化


推荐阅读