将类初始化的const成员传递给Base构造函数?

Par*_*ham 2 c++ c++11

我在派生类中有一个类内初始化const成员,我想将其传递给基类的构造函数.

例:

class Base{
public:
    Base(int a) : i(a){}
private:
    int i;
};

class Derived : Base{
public:
    Derived() : Base(a){}
private:
    const int a = 7;
};

int main(){
    Derived d;
}
Run Code Online (Sandbox Code Playgroud)

但是,这会产生一个未初始化的错误:

field 'a' is uninitialized when used here [-Wuninitialized]
Run Code Online (Sandbox Code Playgroud)

我的印象是const初始化它会直接设置值,允许它以这种方式从派生的ctor传递.我做错了什么还是我的印象不对?const in-class初始化成员何时初始化?

M.M*_*M.M 5

在创建对象期间初始化基类和类成员时,初始化顺序为:

  • 按树顺序排列的虚拟基类
  • 按顺序直接指定非虚拟基类
  • 非静态数据成员,按其声明顺序排列.

所以Base(a)发生之前a = 7发生.

解决这个问题的方法之一是使a是static const或static constexpr.无论如何,这可能是一个好主意,因为非静态const变量使您的类更难以使用.(例如,不会有隐式生成的复制构造函数).