为什么静态初始化顺序Fiasco是这样调用的

Why is Static Initialization Order Fiasco called this way?

本文关键字:调用 Fiasco 静态 初始化 顺序 为什么      更新时间:2023-10-16

由于静态初始化涉及零初始化和使用常量表达式的初始化,根据C++03标准,我看不出会出现哪种惨败。

那么,为什么要用这样的名字,而不是"[Dynamic]初始化顺序Fiasco"?

编辑:

这实际上是一个修辞问题,但我发现我的英语太弱了,无法自我回答。我还松散地使用"静态初始化"作为"main()之前发生的所有初始化"的捷径。但由于"静态"术语已经过载,我写下了这个问题:

  • 作为提醒,"静态初始化"在标准中有一个正式的定义
  • 收集这一措辞的任何历史或轶事原因
  • 对于那些真正被看似矛盾所困惑的人来说

因为C++术语很难,而且技术术语经常与口语表达方式相冲突。

  • 标准中的"静态初始化"就是你所说的,但人们通常用它来指代"在静态存储持续时间的命名空间范围内初始化命名对象"。

  • 另一个例子:人们说"函数返回引用",但事实并非如此:相反,函数调用的求值总是产生,并且值从来都不是引用。区别在于该值是lvalue、xvalue还是prvalue,这取决于函数声明的返回类型。但这更像是一句空话。

这里的"静态"指的是(有点模糊,但不完全准确)具有静态存储持续时间的变量,而不是非局部变量的静态初始化。

你是正确的,惨败只发生在非局部变量的动态初始化中。

为什么用这样的名字?

与任何口语表达一样,人们使用它是因为其他人使用并理解它,即使这不是表达概念的最佳方式。

这是因为程序员通常会陷入被排除在中间的谬论。最常见的症状是:如果它不完美,那就没用。另一个常见症状是:如果没有很好地理解会导致问题的东西,就给它起一个倾向性的名字,比如"静态初始化顺序惨败"。