Initializing Constant Static Array In Header File

后端 未结 6 1979
春和景丽
春和景丽 2020-12-13 12:31

I have just found out that the following is not valid.

//Header File
class test
{
    const static char array[] = { \'1\', \'2\', \'3\' };
};
6条回答
  •  Happy的楠姐
    2020-12-13 13:10

    With constexpr you must define the value on the header even in C++11

    If you use constexpr instead of const, then this answer suggests that you not only can, but must, define on header even in C++11:

    #include 
    
    struct MyClass {
        static constexpr int is[] = {1, 2, 3};
        static constexpr int i = 1;
    };
    
    // TODO is this ever mandatory? Create example that fails on -std=c++11.
    // Pretty sure never mandatory in C++17 https://stackoverflow.com/a/40959093/895245
    // constexpr int MyClass::is[];
    
    int main (void) {
        assert(MyClass::is[0] == 1);
        assert(&MyClass::is[0] == &MyClass::is[1] - 1);
        assert(MyClass::i == 1);
        assert(&MyClass::i == &MyClass::i);
    }
    

    Compile and run with:

    g++-10 -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o main.out main.cpp
    ./main.out 
    

    If instead you try:

    struct MyClass {
        static constexpr int is[];
    };
    
    constexpr int MyClass::is[] = {1, 2, 3};
    

    compilation fails with:

    main.cpp:4:26: error: ‘constexpr’ static data member ‘is’ must have an initializer
    

    Tested on Ubuntu 20.04.

提交回复
热议问题