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

lo *_*cre 5 c++ initialization c++11

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

#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; 
}
Run Code Online (Sandbox Code Playgroud)

因为做这样的事情是一个错误,可以理解:

MyStr()
:j(0),
j(1)
{
}
Run Code Online (Sandbox Code Playgroud)

第一个例子有什么不同,数据成员在声明时初始化,然后再在构造函数的初始化列表中初始化?

Ker*_* SB 10

实际上只发生一次初始化.只是你被允许以brace-or-equals初始化程序的形式编写一个"默认" ,但是如果你的构造函数初始化程序列表也指定了一个初始化程序,那么它就是唯一使用它的程序.

作为旁注,从C++ 14开始,可以为聚合的非静态数据成员(不能具有构造函数)提供大括号或等于初始化程序.


Lig*_*ica 8

这样单个构造函数可以覆盖它.

原始功能提案:

可能会发生数据成员通常具有特定值,但是一些专门的构造函数需要认识到该值.如果构造函数显式初始化特定成员,则构造函数初始化将覆盖成员初始化,如下所示:[..]

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