类初始化与构造函数初始化列表的顺序

ruh*_*ner 3 c++ initialization operator-precedence initialization-list in-class-initialization

我想在类中初始化一堆成员以保持源文件更清晰.但是,对象采用我只通过构造函数接收的参数,并且可以通过赋值在构造函数初始化列表或构造函数中初始化.(第二种选择肯定不会起作用.)这基本上是这样的情景:

在标题中

class Foo
{

public:
    Foo(Pointer * ptr);

private:

    Pointer * ptr;
    Member m1{ptr, "SomeText"};
    Member m2{ptr, "SomeOtherText"};
}
Run Code Online (Sandbox Code Playgroud)

在CPP

Foo::Foo(Pointer*ptr) : 
    ptr(ptr) 
{
    // ...
}   
Run Code Online (Sandbox Code Playgroud)

现在的问题是:标准是否说明了ptrm1/ 之间的初始化顺序m2.显然,这段代码只有在ptr之前m1和之前初始化时才有效m2.

son*_*yao 5

这一点得到了标准的保证,即非静态数据成员将按照类定义中的声明顺序进行初始化.它们如何初始化(通过默认成员初始化程序或成员初始化程序列表)以及这些初始化程序的顺序无关紧要.

[class.base.init]#13.3

(13.3) - 然后,非静态数据成员按照它们在类定义中声明的顺序进行初始化(同样不管mem-initializers的顺序如何).

[注意:声明顺序的作用是确保以初始化的相反顺序销毁基础和成员子对象. - 结束说明]

这意味着,初始化顺序将始终为ptr- > m1- > m2.