Я работаю над пиаром для 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