Defining constexpr static data members
In
int main() { const int &cs = test::stc; }
test::stc
is odr-used while in
int main () {int array[test::stc];}
it is not.
The following example from the C++11 Standard supports the above idea.
struct S { static const int x = 0; }; const int &f(const int &r); int n = b ? (1, S::x) // S::x is not odr-used here : f(S::x); // S::x is odr-used here, so a definition is required
Looking at it from practical point of view, cs
will be an invalid reference unless test::stc
has an address. array
, on the other hand, needs just the value of test::stc
, which can be evaluated at compile time. array
does not need the address of test::stc
to be a valid object.
An object that is odr-used must be defined exactly once in a program.
static constexpr int stc = 1; // declares the static var
constexpr int test::stc; // defines the static var
for more detailed explanation check link below
http://www.learncpp.com/cpp-tutorial/811-static-member-variables/