这个问题很难说,主要是因为术语类实例化与模板实例化。我有一个充满静态函数和成员的模板类。该模板的每个特化都需要在首次使用之前完成一些初始化。
我的初步计划是给模板类一个静态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进行了测试,并且都生成了相同的结果;我的静态成员没有构建。这让我觉得标准需要这种行为,但我很难理解为什么会这样。