1

这个问题很难说,主要是因为术语类实例化与模板实例化。我有一个充满静态函数和成员的模板类。此模板的每个特化都需要在首次使用之前完成一些初始化。

我最初的计划是只给模板类一个静态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 进行了测试,都产生了相同的结果;我的静态成员没有构造。这让我认为标准需要这种行为,但我无法理解为什么会这样。

4

0 回答 0