问题标签 [initialization-order]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
43 浏览

c++ - 在 C++ 中,给定命名空间范围的 const float 依赖于全局 const float,它们的初始化顺序是否得到保证?

如果有一对 .h/.cpp 文件分别具有类似的内容,

在它们中,以及其他带有类似内容的 .cpp 文件

在其中,是否保证在ge之后初始化upperLimit

我知道来自不同翻译单元的全局对象的不确定初始化顺序。我想确定混合全局对象和名称空间范围对象的情况是否属实。

0 投票
1 回答
198 浏览

kotlin - 在内部对象之后初始化伴随对象

假设我想创建一个密封的类,里面装满了一些对象。然后我想创建所有这些对象的列表,所以我在伴生对象中创建列表:

但是,上面代码的问题是,当Color.Blue第一次直接调用时,伴随对象在之前初始化Blue,因此结果列表包含[Red, null]. 这是双重问题,因为 Kotlin 假设列表包含非空值。

我知道上面的例子很简单,我可以用 替换sealed classenum但这只是一个简化的例子。在许多情况下,使用密封类而不是枚举是有益的(例如,当您需要向单个对象添加类型参数时)。

用最少的样板和分配对象来解决这个问题的最佳方法是什么?我想出了两个解决方法,但我不喜欢其中任何一个:

懒惰的

上面的解决方案看起来不错并且不会造成太多样板,但它创建了一个额外的对象,该对象永远为伴随对象中的每个属性而存在。我还需要在任何其他属性上重复惰性关键字。

将初始化移动到另一个对象

这种方法的好处是只为伴生对象中的所有属性创建一个对象,但它创建了许多额外的样板。

有没有更好的方法来实现这一目标?

编辑:对于这种情况,Kotlin 问题跟踪器存在问题:https ://youtrack.jetbrains.com/issue/KT-8970

0 投票
4 回答
137 浏览

c++ - 成员初始化器列表中的赋值操作

我有以下 Stack 类。

注意复制构造函数中的赋值。-Wall -Wextra代码工作,编译良好,编译器(gcc)即使有标志也不会抱怨。编译器会自动将编译器重写为此吗?

还是有什么其他的魔法?我注意到当我更改定义顺序时,编译器会抱怨非按顺序初始化。所以我认为这是我提到的情况。我在文档中找不到任何内容,ASM 输出也对我没有帮助。

0 投票
1 回答
294 浏览

c++ - 静态存储中的内联变量何时初始化?

C++ 标准(至少早于 C++17)已经说明了初始化顺序。

在同一翻译单元的命名空间范围内定义的静态存储持续时间并动态初始化的对象应按照其定义在翻译单元中出现的顺序进行初始化。

C++17 引入了内联变量,我认为这意味着可以在多个翻译单元中定义具有静态存储持续时间命名空间范围以及动态初始化的单个变量。

C++ 是否对这些变量的初始化顺序做出任何保证?

0 投票
2 回答
651 浏览

c++ - 我可以制作 std::set 的 constexpr 对象吗?

我需要一个 std::set 的 const 对象,它将在许多其他 cpp 文件中使用。由于应用程序每个部分的初始化顺序未定义,因此当我使用此 std::set obj 初始化其他 const 对象时,我可能会得到一个空集。

所以,我想把这个 std::set 设置为 constexpr,但它不能被编译。我希望有:

有没有办法得到它?还是根本没有?

0 投票
1 回答
59 浏览

c++ - C++ 将派生类的 const 值传递给基本意外行为的构造函数

我认为这是相当基本的,但我在这里找不到任何来源。

派生类包含需要传递给基类的初始化信息。在这种情况下,它是内存预留。

这惨不忍睹。我希望在派生构造函数之前调用基本构造函数,并且仅在调用派生构造函数时才分配 memorySize。

这按预期工作。

我的问题:我假设第一个示例中的 memorySize 在调用基本构造函数时尚未初始化,还是这里发生了其他事情?

我了解到 #define for constants 在 C++ 中是不可取的,并且最好使用 const 值。这是该规则的一个例外,还是有更合适的方法来处理这种情况?

0 投票
1 回答
139 浏览

c++ - Visual C++:在 DLL 加载期间全局变量初始化顺序是否确定?

假设我构建了一个简单的 DLL,由两个翻译单元组成:

第一的

第二个

我知道 C++ 标准没有指定全局变量初始化的顺序这一事实。问题是:一旦我构建了 Windows DLL,在LoadLibrary调用期间执行的全局变量初始化的顺序是确定性的(每次LoadLibrary调用都会以相同的顺序启动变量的初始化g_foog_bar还是可能取决于某些加载器/系统设置?

0 投票
1 回答
134 浏览

c++ - 在作为静态成员包含在另一个类中的类的构造函数中使用 cout

以下代码

使用 gcc 编译后成功,但使用 clang 编译后因分段错误而崩溃。代码不标准还是clang错误?

https://godbolt.org/z/tEvfrW

0 投票
1 回答
119 浏览

c++ - 什么时候调用 constinit 对象的析构函数?

一般来说,静态对象的析构函数的调用顺序与构造函数的相反。据我了解, constinit 对象是在编译时初始化的,因此应该在“普通”静态对象的析构函数之后调用它们的析构函数。

该程序

(使用 GCC 10),但是,给出了输出

即 constinit 对象在“正常”静态对象之前被销毁(尽管它是较早构造的)。“逆序”规则对 constinit 对象不再有效吗?

0 投票
1 回答
125 浏览

c++ - C++ 多访问说明符和初始化顺序

我们知道在下面的代码中

“i”将在“b”之前初始化。如果我尝试在“i”之前初始化“b”,我会收到警告。

这个案子怎么样:

?

我们知道编译器可以自由排序“i”和“b”,因为它们位于不同的访问说明符中。

那么在这种情况下初始化的顺序是什么?

像前面的简单案例一样有什么保证吗?