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