我正在为一个单身人士进行Boost.Serialization的PR。在这里,我迷上了强制在main之前初始化单例的代码。
相关代码如下:
template<class T>
struct singleton{
static T& instance;
static void use(T*) {};
static T & get_instance() {
static T t;
use(&instance);
return t;
}
};
template<class T>
T & singleton< T >::instance = singleton< T >::get_instance();
根据对引用https://groups.google.com/forum/#!topic/microsoft.public.vc.language/kDVNLnIsfZk的最后一行的介绍的注释以及How singleton in boost implement all singletons are initialized before main is called?中给出的解释,这些内容也应足以确保单例在main之前被实例化。但这似乎并非如此:
#include <cassert>
bool& locked(){
static bool b = false;
return b;
}
struct Foo{ Foo(){ assert(!locked()); } int i;};
int main(){
locked() = true;
singleton<Foo>::get_instance().i = 42;
}
如果对use
的调用已删除,则此声明将失败。但是,根据对PR的评论,采用统一的引用地址已经是不确定的行为,因此我希望将其删除。
但是:为什么要这样做?
讨论链接:https://github.com/boostorg/serialization/pull/105#discussion_r225619041