static RegisterHelper<T> no_use;
构造函数使用了另一个头文件里的const 字符串,结果这个字符串此时还没初始化,——著名的“静态变量初始化顺序不确定”的问题。
以这种方式踩上了,意外意外,熟读EffectiveC++也得实战啊。
更新:
// 编译(链接)时初始化,Static Initalization阶段的 const initialization
const char* p = "hello";
// 加载时初始化,如果有多个静态变量依赖,就会顺序不定
const string s = "hello";
一 p是非局变量,生命周期为全程序(non local `static storage`),
这种变量在main之前初始化,分为两个初始化阶段:
1 Static initialization 静态初始化阶段,两种初始化方式:
1 优先 constant initialization
2 次先 zero-initialized
2 Dynamic initialization 动态初始化阶段
1 ...
2 ...
3 著名的顺序不定:同一文件(Translation Unit)按变量出现顺序;不同文件(Translation Unit)间顺序不定. `Static Initialization Ordre Fiasco`
二 符合 1.1 `constant initialization`,同时具备以下两个条件:
1 该变量有一个初始化器(`initializer`),—— 若没有,其默认初始化器能触发某类初始化动作也行.
2 变量非对象时,initializer的 full-expression 是 const-expression。此例中,full-expression 就是右边的 “hello”,是 const-expression.
变量是对象时,则要求对象调用 constexpr 的构造函数.
因此,指针是const initialization. 但换成string类,就到第二阶段了,动态初始化,就有了顺序不定的问题。
https://en.cppreference.com/w/cpp/language/initialization#Non-local_variables
https://en.cppreference.com/w/cpp/language/siof
--
修改:DoorWay FROM 124.114.151.*
FROM 61.185.194.*