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

What is the correct term for the list that initializes the data members?

哪个是正确的*术语?

PS:他们都在谈论数据成员initializer/ation列表。


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

CPP 标准草案 N4713 指出:

15.6.2 Initializing bases and members [class.base.init]

3 A mem-initializer-list can initialize a base class using any class-or-decltype that denotes that base class type.

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 A ctor-initializer may initialize a variant member of the constructor’s class. If a ctor-initializer specifies more than one mem-initializer for the same member or for the same base class, the ctor-initializer is ill-formed.

  • Bjarne Stroustrup 在他的书中使用术语 成员初始化列表 "The C++ Programming Language"第4版。

  • Scott Meyers 在他的书中使用术语 成员初始化列表 "Effective C++" 第 4 项。他没有 使用标准中使用的术语。

  • 在线 CPP 常见问题解答 (https://isocpp.org) uses the term constructor’s initialization list.

Which is the correct terminology?

“正确”有歧义,让我们看看:

  1. 标准称之为,
  2. C++ 大师称之为,
  3. vulgus调用它。

标准

[lass.base.init]/1&2

1 In the definition of a constructor for a class, initializers for direct and virtual base class subobjects and non-static data members can be specified by a ctor-initializer, which has the form

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 In a mem-initializer-id an initial unqualified identifier is looked up in the scope of the constructor's class and, if not found in that scope, it is looked up in the scope containing the constructor's definition. [ Note: If the constructor's class contains a member with the same name as a direct or virtual base class of the class, a mem-initializer-id naming the member or base class and composed of a single identifier refers to the class member. A mem-initializer-id for the hidden base class may be specified using a qualified name. — end note ] Unless the mem-initializer-id names the constructor's class, a non-static data member of the constructor's class, or a direct or virtual base of that class, the mem-initializer is ill-formed.

它叫做 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 |
+------------------------------+----------------+-------------+

在书面媒体上,那些大师(好吧,每个人都可以写一篇论文或一本书,但大师往往写得更多)称它为成员初始化列表时间。

普通C++程序员

好吧,有一个不知道这是什么,还有一个我听说它叫做 初始化列表。我称之为 初始化列表 ,即使是在用我的母语交谈时也是如此。在法语中,我听说同事称它为初始化列表。我想会有一些变化。

结论

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

C++ 标准 - 至少到目前为止 - 仅使用语法描述 mem-initializer-list ,它被指定为解析规则的一部分。该描述位于 1998 年及以后的所有 C++ 标准版本中标题为 "Initializing bases and members" 的部分中。节号确实发生了变化(例如,在 C++98 中为 12.6.2,在 C++17 中为 15.6.2)。

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

就我个人而言,我使用 "initialiser list" 这个词,因为我在一个接受语言比美国更受英国影响的国家讲英语。