c++ - 我应该总是在类之外定义一个 constexpr 静态数据成员吗?
问题描述
为什么constexpr static
需要在 on 类之外定义数据成员C++11
,C++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_);
}
- 那么这是标准的变化吗?还是我应该总是在课堂之外定义那个成员?
解决方案
问题的措辞非常混乱。static constexpr
自 C++11 起,成员必须内联定义:
如果 LiteralType 的静态数据成员声明为 constexpr,则必须使用初始化程序对其进行初始化,其中每个表达式都是常量表达式,就在类定义中:
https://en.cppreference.com/w/cpp/language/static
只有当此类成员被 ODR 使用时,才需要在 C++11 中单独定义。
从 C++17 开始,static constexpr
成员是隐式内联的,因此 ODR 的使用不需要单独的定义(尽管可以提供)。
推荐阅读
- postgresql - 有没有办法将原始数据输入 PostgreSQL 以复制除某些列之外的行?
- python - 在 Python 中从 json 创建新数组
- c++ - memory_order_acquire 对可简单破坏的类型的引用计数指针是否是多余的?
- r - 如何删除 R-Markdown 块输出中奇怪字符的显示?
- c++ - 从文件读取和写入
- generics - 创建一个绑定到整数类型的泛型函数
- python - 如何理解下面的 crontab?我知道结构,但找不到合适的来源来清楚地解释它
- javascript - 如何从复选框中获取选定的多个值并以表单形式提交以获取匹配的搜索结果
- javascript - 试图找出如何使用“this”来处理单个菜单项
- reactjs - 在 react-final-form 中更新输入模糊的值