静态类成员的初始化。为什么constexpr?

时间:2013-10-11 13:22:57

标签: c++ c++11 initialization static-members constexpr

当我想将静态指针作为类的成员时,我需要constexpr来进行nullptr的初始化。

class Application {
    private:
        constexpr static Application* app = nullptr;
}

有人可以解释我为什么需要这样做吗?我找不到静态变量必须在编译时必须存在的确切原因。

4 个答案:

答案 0 :(得分:8)

那是因为你在类定义中初始化它。这只允许常量积分和枚举类型(总是)和constexpr数据成员(自C ++ 11以来)。通常情况下,您可以在定义它的地方(类外)初始化它,如下所示:

<强> Application.h

class Application {
    private:
        static Application* app;
}

<强> Application.cpp

Application* Application::app = nullptr;

请注意,即使在constexpr情况下也需要提供类外定义,但它必须不包含初始化。不过,我相信第二种情况就是你真正想要的。

答案 1 :(得分:3)

如果你不希望它是constexpr(并且它不是一个整数),那么你需要在类体之外初始化它:

class Application
{
private:
    static Application* app;
};

Application* Application::app = nullptr;

答案 2 :(得分:1)

通常,您需要在类声明之外初始化静态成员变量,除非它是const。我认为this比我更好地解释了它。

答案 3 :(得分:0)

静态变量不需要“在编译时存在”。但是如果要在类中初始化静态变量,则需要在编译时知道它的值。

但是,我不知道这种限制的原因。