constinit ~ к чему такое ограничение
От: Sm0ke Россия ksi
Дата: 23.09.23 12:51
Оценка:
Привет

constinit спецификатор переменной указывает, что её начальное значение должно быть вычисленно в compile-time
( с обращениям к consteval/eonctexpr функциям или ещё как )
Однако остаётся возможность менять состояние этой переменной в run-time

А теперь вопрос: Почему они в стандарте решили запретить указание constinit для локальных "не статических не thread storage duration" переменных внутри функции?

Следовательно этот пример не компилируется: https://godbolt.org/z/qb7zWdenM
int main()
{
  constinit int i{0}; // error
  return i;
}

error: 'constinit' can only be applied to a variable with static or thread storage duration (gcc)
error: local variable cannot be declared 'constinit' (clang)


И приходится такую простую штуку переписывать вот так: https://godbolt.org/z/v9evjGaaa
int main()
{
  static constinit int si{0};
  int i = si;
  return i;
}

Понятное дело что это упрощённый пример. Предполагается, что нестатическая переменная будет ещё как использована (с возможностью изменения).
Отредактировано 23.09.2023 13:10 Sm0ke . Предыдущая версия . Еще …
Отредактировано 23.09.2023 13:10 Sm0ke . Предыдущая версия .
Отредактировано 23.09.2023 13:09 Sm0ke . Предыдущая версия .
Отредактировано 23.09.2023 12:55 Sm0ke . Предыдущая версия .
Отредактировано 23.09.2023 12:54 Sm0ke . Предыдущая версия .
Отредактировано 23.09.2023 12:53 Sm0ke . Предыдущая версия .
Отредактировано 23.09.2023 12:53 Sm0ke . Предыдущая версия .
Re: constinit ~ к чему такое ограничение
От: reversecode google
Дата: 23.09.23 13:17
Оценка: 9 (1)
народ в поиске ответа на этот вопрос пришел к выводу
что ее не правильно в стандарте назвали
правильнее было бы staticinit
потому что хотели решить проблему Static Initialization Order Fiasco
и constinit ее решает
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.