MyTetra Share
Делитесь знаниями!
Что обозначает ключевое слово 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, которая может вызвать ошибку).


Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования