这个问题很难说,主要是因为术语类实例化与模板实例化。我有一个充满静态函数和成员的模板类。此模板的每个特化都需要在首次使用之前完成一些初始化。
我最初的计划是只给模板类一个静态initializer
成员,它将在动态初始化的构造过程中初始化模板类的静态成员。
但是,这是行不通的。除非我在initializer
类中显式调用代码,否则编译器不会为它生成任何代码或存储。
例如:
template<typename Tag>
class WorkerPool
{
struct WorkerInitializer
{
void foo() { }
WorkerInitializer() { WorkerPool<Tag>::start(); }
};
friend struct WorkerInitializer;
static WorkerInitializer _initializer;
static void start() { std::cout << "Started" << std::endl; }
public:
static void async() { std::cout << "Async" << std::endl; }
};
template<typename T> typename WorkerPool<T>::WorkerInitializer
WorkerPool<T>::_initializer;
struct GenericWorker { };
int main()
{
WorkerPool<GenericWorker>::async();
}
输出只是“异步”。
但是,如果我将其更改为调用WorkerPool<T>::async()
调用_initializer.foo()
,那么初始化程序确实会被编译并正确构造,正如我所期望的那样。
为什么编译器拒绝为我的静态成员生成代码?
我用 Visual Studio 2010/2012、gcc 和 clang 进行了测试,都产生了相同的结果;我的静态成员没有构造。这让我认为标准需要这种行为,但我无法理解为什么会这样。