我知道静态订单初始化失败,但我想知道以下是否也会触发它:
const static Point center = CalculateCenter();
static Point currentPoint = center;
我想要两个静态变量(TU中的内部链接),一个是初始化的常量,另一个在大量实例中共享,但一开始它应该具有相同的center
值。
这会引发静态订单初始化失败吗?如果是,我应该如何对此进行编码?
如果它们都在同一个编译单元中,那么就可以了(如果您对它们的排序正确的话)。但如果它们不是,那么由于初始化顺序的原因,这是未定义的行为。但是,您可以将center
声明为constexpr
而不是const
,那么center
在编译时是已知的,这应该是可以的,但是CalculateCenter()
也需要是constexpr
,这在您的情况下可能是不可能的。
在一个编译单元中,顺序定义得很好,并且遵循声明顺序。这个问题出现在不同的单元中,但这里没有这种情况,所以代码完全没有问题。
正如前面的回答所说,在同一个翻译单元中没有问题。秩序得以保留。
如果两个静态变量不在同一个翻译单元中,则应使用以下函数:
//somewhere in a class X
static const Point& center() { const static Point _center = CalculateCenter(); return _center; }
//somewhere in a class Y
static Point& currentPoint() { static Point _current_point = X::center(); return _current_point; }
然后,当您需要变量时,可以使用函数访问器X::center()
或Y::currentPoint()
。