在启动时强制初始化单例

时间:2018-10-18 07:47:14

标签: c++ initialization singleton

我正在为一个单身人士进行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

0 个答案:

没有答案