boost的单例源代码是there,我不明白下面源文件中的两个符号:
// ***include this to provoke instantiation at pre-execution time***
static void use(T const &) {};
BOOST_DLLEXPORT static T & get_instance() {
static detail::singleton_wrapper< T > t;
***// refer to instance, causing it to be instantiated (and
// initialized at startup on working compilers)***
BOOST_ASSERT(! detail::singleton_wrapper< T >::m_is_destroyed);
use(instance);
return static_cast<T &>(t);
}
问题是:这段代码如何在main()之前强制在c ++中初始化singleton?这两个符号是什么意思?
答案 0 :(得分:2)
它不能。就是这条线:
template<class T>
BOOST_DLLEXPORT T & singleton< T >::instance = singleton< T >::get_instance();
它创建一个静态对象,通过调用get_instance
进行初始化。因为它是一个类静态对象,所以它在main之前初始化。
答案 1 :(得分:1)
我认为第一条评论实际上是指上面的一行,
BOOST_DLLEXPORT static T & instance;
构建static
T
个实例。在main
启动之前初始化静态,这只是一个C ++规则。
答案 2 :(得分:1)
您只是展示部分代码,这可以解释为什么您不理解。
在程序执行之前,必须先将其加载到内存中。那时,如果找到静态或全局范围变量,则使用指定的值或默认编译器初始化它。
然后,如果你指定一个类的静态实例,它的构造函数甚至会在main之前被调用! 这就是提升用于提供此功能的内容。