静态变量用另一个初始化

时间:2016-03-25 23:28:54

标签: c++

我知道静态顺序初始化失败,但我想知道以下是否也会触发它:

const static Point center = CalculateCenter();
static Point currentPoint = center;

我想要两个静态变量(TU中的内部链接),一个是初始化和常量,另一个是在大量实例之间共享但最初它应该具有相同的值{{1 }}

这会触发静态订单初始化惨败吗?如果是的话,我应该如何编码呢?​​

3 个答案:

答案 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()