首页 > 解决方案 > 我应该总是在类之外定义一个 constexpr 静态数据成员吗?

问题描述

为什么constexpr static需要在 on 类之外定义数据成员C++11C++14但它不需要 on 和以上的c++ 17要求20

struct Array{
    int static constexpr sz_ = 5;
    int ar_[sz_]{};
};

//int constexpr Array::sz_; // needed on `C++11`, `C++14` but not needed for C++17, C++20

void foo(int const& x){

}

int main(){
    foo(Array::sz_);
}

标签: c++c++11c++17

解决方案


问题的措辞非常混乱。static constexpr自 C++11 起,成员必须内联定义:

如果 LiteralType 的静态数据成员声明为 constexpr,则必须使用初始化程序对其进行初始化,其中每个表达式都是常量表达式,就在类定义中:

https://en.cppreference.com/w/cpp/language/static

只有当此类成员被 ODR 使用时,才需要在 C++11 中单独定义。

从 C++17 开始,static constexpr成员是隐式内联的,因此 ODR 的使用不需要单独的定义(尽管可以提供)。


推荐阅读