初始化数据成员的列表的正确术语是啥?

Posted

技术标签:

【中文标题】初始化数据成员的列表的正确术语是啥?【英文标题】:What is the correct term for the list that initializes the data members?初始化数据成员的列表的正确术语是什么? 【发布时间】:2019-04-25 21:59:07 【问题描述】: 一个同事说初始化列表,另一个初始化 列表。 一个 SO answer 说 初始化器列表,另一个 初始化 列表

哪个是正确的* 术语?

PS:他们都在谈论数据成员初始化器/化列表。


*如果对您来说正确是模棱两可的,您可以退回到使用的术语作为标准。

【问题讨论】:

我对此投了反对票,因为我认为在该术语的两个变体之间分道扬镳是没有意义的。 @einpoklum 感谢您证明您的投票是正确的。您假设我知道没有正确的术语,并且两种变体都可以是正确的。我没有,而且我觉得我不是唯一一个。很抱歉发布了一个污染了您的问题提要的毫无意义的问题。 【参考方案1】:

哪个是正确的术语?

“正确”是模棱两可的,让我们看看:

    标准称之为, C++ 大师称之为, vulgus 调用它。

标准

[lass.base.init]/1&2

1 在类的构造函数的定义中,直接和虚拟基类子对象和非静态数据成员的初始化器可以由 ctor-initializer 指定,其形式为

ctor-initializer:
  : mem-initializer-list

mem-initializer-list:
  mem-initializer ...opt
  mem-initializer-list , mem-initializer ...opt

mem-initializer:
  mem-initializer-id ( expression-list opt )
  mem-initializer-id braced-init-list

mem-initializer-id:
  class-or-decltype
  identifier

2 在 mem-initializer-id 中,在构造函数类的范围内查找初始的非限定标识符,如果在该范围内未找到,则在包含构造函数定义的范围内查找。 [ 注意:如果构造函数的类包含与该类的直接或虚拟基类同名的成员,则命名该成员或基类并由单个标识符组成的mem-initializer-id指的是类成员。可以使用限定名称指定隐藏基类的 mem-initializer-id。 — 尾注 ] 除非 mem-initializer-id 命名构造函数的类、构造函数类的非静态数据成员或该类的直接或虚拟基类,否则 mem-initializer 是非良构的。

它被称为 mem-initializer-list:这是一个我不会亲自使用的技术术语。

C++ 大师

我目前正在观看 Herb Sutter、Kate Gregory、Timur Doumler、John Lakos 等人在 CppCon2018 上进行的演讲......这可以在 Youtube 上找到,我建议你也观看。

他们使用术语初始化列表。或者当它不明确时成员初始化列表

现在,让我们比较一些搜索结果:

                               +----------------+-------------+
                               | Google scholar | Google book |
+------------------------------+----------------+-------------+
| "member initialization list" | 59 results     | 948 results |
| "member initializer list"    | 34 results     | 553 results |
+------------------------------+----------------+-------------+

在书面媒体上,那些大师(好吧,每个人都可以写一篇论文或一本书,但大师倾向于写更多的那些)大部分时间将其称为成员初始化列表。 p>

普通 C++ 程序员

嗯,有一个不知道这是什么,还有一个我听说它叫它初始化列表。我把它称为初始化列表,即使是在用我的母语说话时也是如此。在法语中,我听说同事称它为初始化列表。那么我猜会有一些变化。

结论

称它为初始化列表。这对我来说是正确的术语。

【讨论】:

今天,在检查我的answer 的 C++ 版本支持时,我收到了这个警告:warning: extended initializer lists only available with -std=c++11,这进一步支持了你的答案。【参考方案2】:

C++ 标准 - 至少到目前为止 - 只使用语法描述 mem-initializer-list,它被指定为解析规则的一部分。该描述位于 1998 年及更高版本的 C++ 标准的所有版本中标题为“初始化基和成员”的部分中。节号确实发生了变化(例如,在 C++98 中为 12.6.2,在 C++17 中为 15.6.2)。

标准中没有英文描述。因此,人们通常会使用他们认为代表该概念的任何措辞。

就个人而言,我使用“initialiser list”一词,因为我是一个说英语的国家,接受的语言受英国的影响比美国更大。

【讨论】:

【参考方案3】:

CPP 标准草案 N4713 指出:

15.6.2 初始化基和成员 [class.base.init]

3 mem-initializer-list 可以使用任何表示基类类型的 class-or-decltype 来初始化基类。

struct A  A(); ; 
typedef A global_A; 
struct B  ; 
struct C: public A, public B  C(); ; 
C::C(): global_A()   // mem-initializer for base A 

5 ctor-initializer 可以初始化构造函数类的变体成员。如果一个 ctor-initializer 为同一个成员或同一个基类指定了多个 mem-initializer,则该 ctor-initializer 格式错误。

Bjarne Stroustrup 在他的书“C++ 编程语言” 第 4 版中使用了术语成员初始化列表

Scott Meyers 在他的书“Effective C++”第 4 项中使用了术语成员初始化列表。他使用了 不要使用标准使用的术语。

在线 CPP 常见问题解答 (https://isocpp.org) 使用术语 constructor’s initialization list

【讨论】:

以上是关于初始化数据成员的列表的正确术语是啥?的主要内容,如果未能解决你的问题,请参考以下文章

将成员函数集调用为特定变体的正确 C++ 变体语法是啥?

C++成员初始化列表(构造函数后加冒号:)(用于在构造函数中初始化类成员变量,可以避免使用构造函数体内的赋值语句,可以确保成员变量在对象构造之初就已经被正确初始化,提高代码的性能和可读性)

c2797 未实现成员初始化器列表或非静态数据成员初始化器内的列表初始化

成员初始化器列表和非静态数据成员的默认成员初始化器有啥区别?

C++_const 常量成员以及成员初始化列表及其常量类

C++_const 常量成员以及成员初始化列表及其常量类