Defining constexpr static data members

若如初见. 提交于 2019-11-29 14:32:13

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/

C++17 inline variables

In C++17 if you also mark the static member as inline, then I believe that you can odr-use it freely or have multiple definitions across compilation units, e.g.:

#include <iostream>

class MyClass {
    public:
        inline static constexpr int i = 42;
};


int main() {
    const int &cs = MyClass::i;
    std::cout << cs << std::endl;
    std::cout << &MyClass::i << std::endl;
}

More info at: How do inline variables work?

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!