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

6
考虑以下代码:

#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 中编译。如果我们在定义中交换 const 和声明中的 constexpr,它也可以编译。我知道 constexpr 对变量意味着 const,但反之则不然。
1个回答

1

在查看一些文档,比如那个时,我想提出我的两个观点。

实际上,这是可以有效的。

事实上,constexprconst之间的区别主要在于它们的目的不同,但前者作为副作用意味着后者。

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

特别地:

const的主要功能是表达一个对象通过接口没有被修改的想法。

另一方面:

constexpr的主要功能是扩展可以在编译时计算的范围,使这种计算在编译时环境中具有类型安全性并且可用。

或者更简洁地来自这里:

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

无论如何,总会发生这样的事情:

在变量定义前加上“constexpr”[...]意味着“const”。因此,尽管使用“constexpr”而不是“const”的原因很明确,每个人都倾向于记住这一点:“constexpr”不是“const”的通用替代品(反之亦然)。无论如何,一旦定义了成员,该成员就只是一个具有“const”类型限定符(可用于常量表达式)的数据成员,这就是你在类外声明的内容。使用“constexpr”,实际上是在暗示该成员隐含为“const”(同时你还有一组更具体的约束条件来定义该成员)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接