【问题标题】:Use of parenthesis or curly braces in C++ constructor initializer list [duplicate]在 C++ 构造函数初始值设定项列表中使用括号或花括号 [重复]
【发布时间】:2022-01-01 10:36:55
【问题描述】:

我有一个关于构造函数初始化列表的问题,如下所示: 在指定成员的初始值时,根据 C++ Primer 书(作者 - Stanley Lippman)将初始值写入 ()- 括号中。但是,我也看到 {} 用于指定初始值(请参阅链接 - https://en.cppreference.com/w/cpp/language/constructor) 有人可以解释何时使用 () - 括号以及何时使用 {} - 花括号 谢谢并恭祝安康, -苏尼尔·普拉尼克

【问题讨论】:

标签: c++ list constructor initializer


【解决方案1】:

根据 Scott meyors Effective Modern C++,Item 7,您基本上应该在初始化列表中尽可能使用{}。如果您正在初始化一个采用std::initializer_list 的类型,那么您需要多考虑一下。但在std::vector 和模板之外,您基本上应该始终使用{} 来构造。为什么?来自 Scott Meyors:

花括号初始化是最广泛使用的初始化语法,它可以防止 缩小转换范围,并且不受 C++ 最棘手的解析的影响。

【讨论】:

    【解决方案2】:

    使用T x{};,其中T 是某种类型,称为零初始化

    括号 ()Pre-C++11 而大括号 {} 是从 C++11 及以后(如 c++11、c+ +14 等)。这只是两者之间的众多差异之一。 例如,

    C++11 前

    class MyVector
    {
        int x;
        MyVector(): x()
        {
        }
    };
    

    C++11

    从 C++11 及以后,您可以使用 {} 代替,如下所示:

    class MyVector
    {
        int x;
        MyVector(): x{}
        {
        }
    };
    

    构造函数初始化列表(这是您的问题所在)的上下文中,它们用于确保正确初始化非类模板的静态数据成员,如 here 所述。

    【讨论】:

    • @SunilPuranik 不客气。为什么需要它们,您可以参考this