Strange behavior with constexpr static member variable

前端 未结 2 1037
一生所求
一生所求 2020-12-03 22:03

This is a follow up question to Undefined reference to static constexpr char[][].

The following program builds and runs fine.

#include 

        
2条回答
  •  情话喂你
    2020-12-03 22:15

    In addition to the information provided by @hvd in his answer...

    From the C++ Draft Standard N3337 (emphasis mine):

    9.4.2 Static data members

    3 If a non-volatile const static data member is of integral or enumeration type, its declaration in the class definition can specify a brace-or-equal-initializer in which every initializer-clause that is an assignment- expression is a constant expression (5.19). A static data member of literal type can be declared in the class definition with the constexpr specifier; if so, its declaration shall specify a brace-or-equal-initializer in which every initializer-clause that is an assignment-expression is a constant expression. [ Note: In both these cases, the member may appear in constant expressions. — end note ] The member shall still be defined in a namespace scope if it is odr-used (3.2) in the program and the namespace scope definition shall not contain an initializer.

    Given that A::data is odr-used in the expression A::data[0], as per the standard, it shall be defined in a namespace scope. The fact that g++ is able to successfully create a program without A::data being defined in a namescpace scope does not make the program right. To be standards compliant, A::data shall be defined.

提交回复
热议问题