为什么 constexpr 数据成员不是隐式静态的?

Nic*_*ick 5 language-lawyer constexpr c++11

如果你这样做:

constexpr int LEN = 100;
Run Code Online (Sandbox Code Playgroud)

LEN变量定义为const无需键入const关键字。
它还具有static存储功能,无需键入static关键字。

另一方面,如果我们在class

struct A{
   constexpr static int SIZE = 100;
};
Run Code Online (Sandbox Code Playgroud)

SIZE仍然定义为const不需要输入 const 关键字,

然而SIZE不是static数据成员。
您需要static明确键入。如果不这样做,将出现编译错误。

问题是:
需要显式输入的原因是什么static

sp2*_*nny 1

constexpr不应该暗示static,因为constexpr 没有static有意义。考虑:

#include <iostream>

struct Dim
{
    constexpr Dim(int a,int b) : a(a), b(b) {}
    constexpr int Prod() const { return a*b; }
    int a,b;
};

int main()
{
    constexpr Dim sz(3,4);
    int arr[ sz.Prod() ];
    std::cout << sizeof(arr) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

它也不应该暗示static类定义之外,因为static它意味着“翻译单元本地”并且constexpr 不需要这样。

  • 在命名空间范围内,“constexpr”并不完全意味着“static”,但它很接近。它意味着“const”,并且命名空间范围的非易失性“const”变量默认具有内部链接(即“静态”)。 (3认同)