|
|||||||
Что обозначает ключевое слово constinit в C++20
Время создания: 30.08.2023 09:53
Текстовые метки: язык, c++, C++20, стандарт, constinit, безумие
Раздел: Компьютер - Программирование - Язык C++ (Си++) - Стандарт C++11 и выше
Запись: xintrea/mytetra_syncro/master/base/169337843199mplms3fv/text.html на raw.github.com
|
|||||||
|
|||||||
Что можно подумать, увидев ключевое слово constinit в тексте программы на каком-нибудь новом языке программирования? Можно было бы предположить, что в данном месте происходит инициализация константы. В любом случае, слова const и init говорят человеку о том, что некое действие связано с инициализацией, и, скорее всего, инициализацией чего-то постоянного. Правильно? Конечно, нет! Вы имеете дело с профессионалами из комитета по стандартизации языка Си++. Туда кого попало с улицы не набирают. Поэтому если вы расчитывали на то, что в языке будут логичные конструкции, которые (о, боже!) сами объясняют своей структурой и именованием что они делают, то убирайтесь к черту! Этим суровым ребятам нужен язык с ловушками, в которые будут попадать простаки, чтобы с позором их изгонять из своих рядов. Чем больше ловушек - тем лучше! Ключевое слово constinit - это еще один сюрприз от разработчиков языка, чтобы программист не расслаблялся и умел видеть за определенным названием совершенно другие смыслы. * * * По своей сути, constinit гарантирует, что переменная, к которой он применяется, будет инициализирована во время компиляции. Такое поведение полезно для глобальных и статических переменных, поскольку позволяет избежать проблем с порядком динамической инициализации. Ключевое слово constinit обеспечивает инициализацию переменных во время компиляции, вот и все! Почему бы этот спецификатор не назвать compiletimeinit, совершенно непонятно. Рассмотрим следующий пример: #include <array> // Инициализация на этапе компиляции constexpr int compute(int v) { return v*v*v; } constinit int global = compute(10); // Это не будет работать: // constinit int another = global; int main() { // Но допускает изменения в дальнейшем... global = 100; // global не является константой! // std::array<int, global> arr; } В приведенном выше коде глобальная переменная инициализируется во время компиляции с помощью функции compute(). Однако, в отличие от const и constexpr, спецификатор constinit не делает переменную константой. Он означает, что, хотя начальное значение и задается во время компиляции, оно может быть изменено во время выполнения. Это показано в коде функции main(). Кроме того, поскольку переменная constinit не является constexpr, ее нельзя использовать для инициализации другого constinit-объекта (в коде выше - это закомментированная строка с int another, которая может вызвать ошибку). |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|