Почему constexpr должен быть статическим?

Nov 16 2020

Прочитав это и это, я все еще не понимаю, что такое выражения:

static constexpr int = 0;

AFAIK, в С ++:

  • static обеспечивает постоянный адрес памяти на протяжении всего выполнения и безопасную инициализацию с параллельными потоками
  • constexpr обеспечивает оценку времени компиляции как rvalue, что означает, что у него не должно быть адреса памяти

Мне они кажутся противоречивыми. staticгарантирует, что переменная будет иметь адрес долговременной памяти, тогда как constexprгарантирует обратное предположение. Удивительно, но обсуждение в первой ссылке упоминает это:

constexpr int x = 3;
const int* p = &x;

Как мы даже можем получить адрес памяти, xесли это rvalue?

Может ли кто-нибудь объяснить это? заранее спасибо

Ответы

1 MSalters Nov 16 2020 at 17:10

staticимеет ряд значений. В классах (согласно вашему комментарию) это означает, что член связан с классом, а не с конкретным экземпляром (объектом) этого класса.

Для a constexprэто имеет большой смысл. Обычно это инициализируется значением, известным компилятору, а не аргументами ctor.