考虑代码
#include <iostream>
struct Foo
{
constexpr static int n = 42;
};
const int Foo::n; // note const, NOT constexpr
int main()
{
std::cout << Foo::n;
}
静态成员的定义与类内声明不同,即使用const
代替constexpr
。代码是否合法,如果是,为什么?它用gcc和clang编译。如果我们分别在定义和声明中互换{{1}}和const
,它也会编译。我知道constexpr
隐含constexpr
变量,但不是相反。
答案 0 :(得分:1)
我的两分钱,同时查看了that one等文档。
实际上,它可能是有效的。
事实上,constexpr
和const
之间的差异主要取决于他们的目的,但前者暗示后者是副作用。
还有一个更微妙的区别:constexpr
是说明符,而const
是类型限定符。
特别是:
const的主要功能是表达不通过接口
修改对象的想法
另一方面:
constexpr的主要功能是扩展编译时可以计算的范围,使这种计算类型安全并且在编译时上下文中也可用
或者从here更简洁:
constexpr - 指定变量或函数的值可以出现在常量表达式
中
无论如何它发生在:
constexpr在变量定义[...]前面意味着const
所以,即使应该使用constexpr
代替const
的原因很明显,并且每个人都倾向于记住:
constexpr不是const的通用替代品(反之亦然)
事实上,使用constexpr
实际上是说这个成员是隐式的const
(对于如何定义成员,你还有一套更具体的约束)。
无论如何,一旦定义,该成员只不过是具有const
类型限定符(可以在常量表达式中使用)的数据成员,这就是您从类中声明的内容。