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

Mat*_*reu 5 c++ initialization static-members constexpr c++11

当我想要一个静态指针作为我需要constexpr进行初始化的类的成员时nullptr.

class Application {
    private:
        constexpr static Application* app = nullptr;
}
Run Code Online (Sandbox Code Playgroud)

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

Rei*_*ica 8

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

Application.h

class Application {
    private:
        static Application* app;
}
Run Code Online (Sandbox Code Playgroud)

Application.cpp

Application* Application::app = nullptr;
Run Code Online (Sandbox Code Playgroud)

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