为什么constexpr必须是静态的?

The*_*ask 8 c++ clang constexpr c++11

尝试使用constexpr属性创建结构的成员而不是静态会导致编译器错误(请参阅下文).这是为什么?对于单个常量值,我将在内存中使用此值,直到程序终止而不仅仅是struct的范围?我应该回去使用宏吗?

struct foo
{
  constexpr int n = 10;
  // ...
};

error: non-static data member cannot be constexpr; did you intend to make it static?
Run Code Online (Sandbox Code Playgroud)

Joh*_*itb 12

我不知道官方理性.但肯定会导致混乱.举个例子,我看不出它对非静态数据成员意味着什么constexpr.你能做到以下几点吗?

struct foo {
  constexpr int n = 10;
  constexpr foo() { }
  constexpr foo(int n):n(n) { } // overwrite value of n
};
Run Code Online (Sandbox Code Playgroud)

或者它是否意味着初始化程序必须始终是常量,即不允许你写上面的内容(因为n它不是常数/可能是非常数)但是允许说

foo f = { 10 };
Run Code Online (Sandbox Code Playgroud)

constexpr int n简单的形式而不是隐含的规则static对我来说似乎很好,因为它的语义不明确IMO.

  • 我认为 `constexpr int n = 10` 没有任何问题,因为它是一个整数类型,在编译期间每次使用 `n` 都应该用它的值代替,就像在 `define` 的情况下一样。语法很清楚,我不明白为什么标准不允许。 (2认同)