为什么静态初始化顺序Fiasco是这样调用的
Why is Static Initialization Order Fiasco called this way?
由于静态初始化涉及零初始化和使用常量表达式的初始化,根据C++03标准,我看不出会出现哪种惨败。
那么,为什么要用这样的名字,而不是"[Dynamic]初始化顺序Fiasco"?
编辑:
这实际上是一个修辞问题,但我发现我的英语太弱了,无法自我回答。我还松散地使用"静态初始化"作为"main()
之前发生的所有初始化"的捷径。但由于"静态"术语已经过载,我写下了这个问题:
- 作为提醒,"静态初始化"在标准中有一个正式的定义
- 收集这一措辞的任何历史或轶事原因
- 对于那些真正被看似矛盾所困惑的人来说
因为C++术语很难,而且技术术语经常与口语表达方式相冲突。
-
标准中的"静态初始化"就是你所说的,但人们通常用它来指代"在静态存储持续时间的命名空间范围内初始化命名对象"。
-
另一个例子:人们说"函数返回引用",但事实并非如此:相反,函数调用的求值总是产生值,并且值从来都不是引用。区别在于该值是lvalue、xvalue还是prvalue,这取决于函数声明的返回类型。但这更像是一句空话。
这里的"静态"指的是(有点模糊,但不完全准确)具有静态存储持续时间的变量,而不是非局部变量的静态初始化。
你是正确的,惨败只发生在非局部变量的动态初始化中。
为什么用这样的名字?
与任何口语表达一样,人们使用它是因为其他人使用并理解它,即使这不是表达概念的最佳方式。
这是因为程序员通常会陷入被排除在中间的谬论。最常见的症状是:如果它不完美,那就没用。另一个常见症状是:如果没有很好地理解会导致问题的东西,就给它起一个倾向性的名字,比如"静态初始化顺序惨败"。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- std::cout.imbue()多重调用
- 为什么静态初始化顺序Fiasco是这样调用的