C++ 编译时的单例初始化

C++ 编译时的单例初始化,c++,c++11,C++,C++11,我只是在想,是否可以使用新的C++11类内成员初始值设定项在编译时初始化单例,这可能会加快我应用程序中某些管理器类的速度: class CSingleton { public: CSingleton(void) {} ~CSingleton(void) {} static const CSingleton* GetInstance(void) { return Instance; } bool Foo1(int x); b

我只是在想,是否可以使用新的C++11类内成员初始值设定项在编译时初始化单例,这可能会加快我应用程序中某些管理器类的速度:

class CSingleton
{
public:
    CSingleton(void) {}
    ~CSingleton(void) {}
    static const CSingleton* GetInstance(void)
    {
        return Instance;
    }

    bool Foo1(int x);
    bool Foo2(int y);
private:
    static constexpr CSingleton *Instance = new CSingleton();
}
问题在于,这会导致以下错误:

Line of Instance declaration:    error: invalid use of incomplete type 'class test::CSingleton'
First Line of class declaration: error: forward declaration of 'class test::CSingleton'
有没有一种方法可以在编译时用这种或另一种方法初始化单例


[我在MacOSX10.7(和Ubuntu)上使用GCC4.7,并设置了-std=c++0x标志]

类的.h文件成员:

static CSingleton s_Instance;
include之后开始处的.cpp文件中

CSingleton::s_Instance = CSingleton();
这是编译时的初始化。
使用new-这是运行时的初始化。正式来说,这两个类都是在编译时初始化的。

这个类看起来不太像一个单例…除了不完整的类型问题,您如何期望在编译时执行对
操作符new
的调用?@Job完全没有做到这一点。感谢您无法在编译时初始化变量,因为变量仅在运行时存在。您可能正在寻找术语静态初始化。
constexpr
singleton是一个非常奇特的概念。。。根据设计,单例是一个美化的全局变量。
constexpr
对象不会变化。我想你在找一个
constexpr
构造函数。谢谢,这正是我要找的。真不敢相信我自己没能做到……正式地说,这是在程序启动时初始化的,而不是编译时。如果您使用静态对象,那么要小心。@Mike甚至
extern
对象都不幸遭受了这种失败。只有裸数组初始化才能避免这些事情。@rubenvb:的确;所谓“静态”,我指的是静态存储持续时间(包括
extern
),而不是静态链接或静态成员。很遗憾,“静态”在C++中意味着很多不同的东西。