Принудительная инициализация синглтона при запуске - PullRequest
0 голосов
/ 18 октября 2018

Я работаю над пиаром для Boost.Serialization относительно синглтона.Там я запутался в коде, который заставляет инициализировать синглтон перед главным.

Соответствующий код (как) это:

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 и объяснение также приведено в Как в синглтоне в boost реализованы все синглтоны, которые инициализируются до вызова main? этого должно быть достаточно, чтобы убедиться, что синглтон создается перед 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 удален.Тем не менее, согласно комментарию о связи с общественностью, использование адреса унифицированной ссылки уже является неопределенным поведением, поэтому я хотел бы удалить его.

Но: зачем это нужно?

Ссылка на обсуждение:https://github.com/boostorg/serialization/pull/105#discussion_r225619041

...