我知道静态顺序初始化失败,但我想知道以下是否也会触发它:
const static Point center = CalculateCenter();
static Point currentPoint = center;
我想要两个静态变量(TU中的内部链接),一个是初始化和常量,另一个是在大量实例之间共享但最初它应该具有相同的值{{1 }}
这会触发静态订单初始化惨败吗?如果是的话,我应该如何编码呢?
答案 0 :(得分:3)
明确规定,在一个编制单元中,订单已明确定义,并遵循声明顺序。问题出现在不同的单位,这不是一个案例,所以代码是完全正常的。
答案 1 :(得分:2)
如果它们都在同一个编译单元中,那么它没问题(如果你正确订购它们)。但是,如果他们不是,那么由于初始化顺序,它是未定义的行为。但是,您可以将center
声明为constexpr
而不是const
,然后在编译时知道center
应该没问题,但是CalculateCenter()
也需要是constexpr
,这在你的情况下可能是不可能的。
答案 2 :(得分:1)
正如之前的回答所说,在同一个翻译单元中没有问题。订单保留。
如果两个静态变量不在同一个翻译单元中,则应使用函数,如下所示:
//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()
。