定义与constexpr静态成员的声明不同

时间:2015-12-03 04:52:04

标签: c++ c++11 language-lawyer

考虑代码

#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变量,但不是相反。

1 个答案:

答案 0 :(得分:1)

我的两分钱,同时查看了that one等文档。

实际上,它可能是有效的。

事实上,constexprconst之间的差异主要取决于他们的目的,但前者暗示后者是副作用。

还有一个更微妙的区别:constexpr说明符,而const类型限定符

特别是:

  

const的主要功能是表达不通过接口

修改对象的想法

另一方面:

  

constexpr的主要功能是扩展编译时可以计算的范围,使这种计算类型安全并且在编译时上下文中也可用

或者从here更简洁:

  

constexpr - 指定变量或函数的值可以出现在常量表达式

无论如何它发生在:

  

constexpr在变量定义[...]前面意味着const

所以,即使应该使用constexpr代替const的原因很明显,并且每个人都倾向于记住:

  

constexpr不是const的通用替代品(反之亦然)

事实上,使用constexpr实际上是说这个成员是隐式的const(对于如何定义成员,你还有一套更具体的约束)。

无论如何,一旦定义,该成员只不过是具有const类型限定符(可以在常量表达式中使用)的数据成员,这就是您从类中声明的内容。