我正在查看http://www.boost.org/doc/libs/1_47_0/boost/pool/detail/singleton.hpp
的文档我的问题:因为create_object是类singleton_default的静态成员,所以应该在main之前调用它的构造函数。从object_creator的构造函数中调用singleton_default :: instance,这样可以确保在main之前实例化obj。我不能遵循的是对do_nothing方法的需求。文档提到它强制create_object的实例化,但不是应该在main启动之前初始化的类的静态成员?那个令牌应该是singleton_default :: create_object实例化不够好吗?
这是代码
// T must be: no-throw default constructible and no-throw destructible
template <typename T>
struct singleton_default
{
private:
struct object_creator
{
// This constructor does nothing more than ensure that instance()
// is called before main() begins, thus creating the static
// T object before multithreading race issues can come up.
object_creator() { singleton_default<T>::instance(); }
inline void do_nothing() const { }
};
static object_creator create_object;
singleton_default();
public:
typedef T object_type;
// If, at any point (in user code), singleton_default<T>::instance()
// is called, then the following function is instantiated.
static object_type & instance()
{
// This is the object that we return a reference to.
// It is guaranteed to be created before main() begins because of
// the next line.
static object_type obj;
// The following line does nothing else than force the instantiation
// of singleton_default<T>::create_object, whose constructor is
// called before main() begins.
create_object.do_nothing();
return obj;
}
};
template <typename T>
typename singleton_default<T>::object_creator
singleton_default<T>::create_object;
我尝试删除do_nothing方法,但是在main之前停止了对象实例化。
答案 0 :(得分:1)
您必须查看 3.6.2非局部变量初始化 部分的标准。
首先是第2点的原则:
具有静态存储持续时间(...)的变量应为零初始化 在进行任何其他初始化之前。
执行常量初始化:(...)
一起调用零初始化和常量初始化 静态初始化;所有其他初始化是动态的 初始化。静态初始化应在任何之前执行 动态初始化发生。动态初始化一个 具有静态存储持续时间的非局部变量是有序的或 无序的。显式专用类模板静态的定义 数据成员已经订购了初始化。
然后在第4点,对你的问题的解释(你的单身人士要求&#34;动态初始化&#34;):
它是实现定义的动态初始化 具有静态存储持续时间的非局部变量在之前完成 主要的第一个声明。如果初始化推迟到某些 在主要的第一个陈述之后的时间点,它应该在之前发生 第一次使用同一个中定义的函数或变量 翻译单位作为要初始化的变量。
这个do_nothing()
只是确保首次使用和动态初始化的顺序。
你没有do_nothing()
,在第一次调用create_object()
之前,不需要全局静态instance()
和静态{obj
此函数内的{1}}仅在第一次调用时初始化,即在main()
开始后。