Пусть имеется такой код:
int main()
{
constexpr int x = 0;
}
Известно, что значение x вычисляется на этапе компиляции и что constexpr - типобезопасная замена #define. Также x - локальная переменная, локальные переменные выделяются на стеке.
Где будет храниться значение x? На стеке? По идее не должно быть так, потому что это работает как #define, а дефайны на стеке не выделяются. Есть ли класс памяти у constexpr единиц хранения?
С формально-абстрактной точки зрения вы предоставили определение локального объекта, которое трактуется по общим правилам для локальных объектов - x будет иметь обычный автоматический storage duration, как у обычной локальной переменной. constexpr на это никак не виляет.
А будет ли x фактически где-то храниться - это уже решение принимаемое компилятором. Если объект не является odr-used в программе, то и определения для него не требуется, т.е. фактически хранить его где-либо нет никакой необходимости (независимо от константности такого объекта). То есть говорить о хранении объекта, который не является odr-used - довольно бессмысленное занятие.
В вашем случае x не является odr-used, потому и хранить его нигде фактически не надо. Не существует способа проверить где "хранится" x не сделав x odr-used, т.е. пытаться выяснить это путем эксперимента будет бесполезным занятием - именно ваш эксперимент и будет причиной "хранения".
Вот в такой программе
int main()
{
constexpr int x = 0;
int a[x + 1];
std::cout << x << std::endl;
}
x тоже не является odr-used и храниться где-то совсем не обязан.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей