为什么 C++11 允许二次初始化

Why is second initialization allowed in C++11

在 C++11 下,可以在声明时直接初始化 class 成员。但是在构造函数的初始化列表中再初始化一次也是可以的...为什么?

#include <iostream>



struct MyStr
{

    MyStr()
    :j(0)
    {
        std::cout << "j is " << j << std::endl; // prints "j is 0"
    }

    const int j = 1;

};

int main()
{
    const int i = 0;

    MyStr mstr; 
}

因为这样做是错误的,可以理解:

MyStr()
:j(0),
j(1)
{
}

第一个示例有何不同,其中数据成员在声明时被初始化,然后在构造函数的初始化列表中再次初始化?

以便单个构造函数可以覆盖它。

来自the original feature proposal

It may happen that a data member will usually have a particular value, but a few specialized constructors will need to be cognizant of that value. If a constructor initializes a particular member explicitly, the constructor initialization overrides the member initializations as shown below: [..]

请记住,您可以有多个构造函数。

只有一个初始化实际发生。只是允许您以 大括号或等于初始化程序 的形式编写 "default" 一个,但是如果您的构造函数初始化程序列表也指定了一个初始化程序,那个是唯一使用的。

附带说明,从 C++14 开始,可以为聚合的非静态数据成员提供 大括号或等于初始值设定项(不能有构造函数)。