Учитывая пример с этой страницы, воспроизводится ниже
struct S {
static const int c;
};
const int d = 10 * S::c; // not a constant expression: S::c has no preceding
// initializer, this initialization happens after const
const int S::c = 5; // constant initialization, guaranteed to happen first
Почему инициализация d
не является константным выражением (и, следовательно, не является частью процесса постоянной инициализации)? Комментарий, кажется, говорит, что это потому, что оно использует значение, которое не имеет предшествующего инициализатора, но это, похоже, не упоминается в списке условий, которые квалифицируют выражение как постоянное выражение (указаны условия здесь). В частности, какое условие, которое квалифицирует что-то как постоянное выражение, нарушает?
Если это связано с тем фактом, что постоянная инициализация должна оцениваться во время компиляции, то в стандарте упоминается, что постоянная инициализация не должна выполняться во время компиляции и даже может произойти, например, при загрузке. Тогда почему бы просто не инициализировать c
во время компиляции и просто d
во время загрузки? (Я мог бы подумать о себе в круг)
Благодаря Jayesh я смог найти аналогичный вопрос "удивительный" постоянная инициализация из-за порядка определения, но ответ, похоже, говорит о преобразовании lvalue в rvalue, где здесь lvalue для преобразования rvalue? Помимо этого не было никакой цитаты из стандарта, о котором здесь было нарушено условие. Ответы также не объясняют, почему инициализация не разделяется на время загрузки и во время компиляции.