Информация об изменениях

Сообщение constinit ~ к чему такое ограничение от 23.09.2023 12:51

Изменено 23.09.2023 13:10 Sm0ke

constinit ~ к чему такое ограничение
Привет

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;
}

Понятное дело что это упрощённый пример. Предполагается, что нестатическая переменная будет ещё как использована (с возможностью изменения).
constinit ~ к чему такое ограничение
Привет

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;
}

Понятное дело что это упрощённый пример. Предполагается, что нестатическая переменная будет ещё как использована (с возможностью изменения).