Учитывая следующее объявление в глобальном пространстве имен:
constexpr int x = x;
Является ли это хорошо сформированным?
В стандартном разделе проекта С++ 14 3.6.2
[basic.start.init] говорится:
Переменные со статической продолжительностью хранения (3.7.1) или продолжительностью хранения потоков (3.7.2) должны быть инициализированы нулями (8.5) перед любой другой инициализацией. [...]
То, что, по-видимому, хорошо описывает пример, заключается в том, что x
инициализируется собственным значением при постоянной инициализации, которая будет 0
из-за нулевой инициализации.
Это действительно так? clang принимает этот код, а gcc производит диагностику:
error: the value of 'x' is not usable in a constant expression
constexpr int x = x;
^