Описание тега constinit

2 ответа

Что такое constinit в C++20?

constinit- это новое ключевое слово и спецификатор в C++20, предложенный в P1143. В стандарте предусмотрен следующий пример: const char * g() { return "dynamic initialization"; } constexpr const char * f(bool p) { return p ? "constant initializer" :…
08 сен '19 в 22:31
1 ответ

В чем реальная разница между "constinit" и "constexpr"?

constexpr int f() { return 0; } int g() { return 0; } constexpr auto c1 = f(); // OK constinit auto c2 = f(); // OK constexpr auto d1 = g(); // ill-formed constinit auto d2 = g(); // ill-formed int main() {} Как показано в приведенном выше коде, я н…
18 июн '20 в 10:22
0 ответов

Когда использовать constinit и consteval?

Использование constexpr довольно просто, чтобы убедиться, что код может быть оценен во время самой компиляции. Но последние функции C++ 20, которые обеспечивают constinit а также constevalнемного сбивают с толку. Может ли кто-нибудь предоставить пра…
05 июл '20 в 11:11
1 ответ

Когда вызывается деструктор объекта constinit?

Обычно говорят, что деструкторы статических объектов вызываются в порядке, обратном конструкторам. Насколько я понимаю, объекты constinit инициализируются во время компиляции, поэтому их деструкторы должны вызываться после деструкторов "обычных" ста…
1 ответ

Может ли C++20 `constinit` отказаться от изящной идиомы счетчика?

Представлен C++20 constinit чтобы избежать фиаско с порядком статической инициализации. Может constinitотказаться от изящной идиомы счетчика (например, для инициализацииstd::cout)?
17 мар '20 в 16:40
3 ответа

static_assert не работает при использовании constinit const. Путаница в переменных constinit, constinit const, constexpr, const, nonconst

У меня вопрос о функциях времени компиляции. Я понимаю, что static_assert должен работать только с типами, которые можно оценивать / вычислять во время компиляции. Таким образом, он не работает с std::string (пока что в gcc10 нет поддержки constexpr…
01 окт '20 в 17:29
2 ответа

В каком практическом случае полезно использовать «const constinit»?

Ответ на этот вопрос от Vittorio Romeo очень хорошо объясняет. В его ответе упоминается следующее: не эквивалентен, поскольку первое требует постоянного разрушения , а второе - нет. Хотя это довольно ясно, я не вижу в этом практического применения. …
02 июл '21 в 14:20
2 ответа

как гарантировать инициализацию переменной стека с постоянной времени компиляции

В C++20 у нас теперь есть . и . Теперь я могу гарантировать, что статическая переменная инициализируется результатом функции или с помощью . В ПОРЯДКЕ Я также могу гарантировать, что переменная стека инициализируется результатом consteval функция, в…
10 янв '22 в 12:54
0 ответов

Инициализировать указатель с constinit

Мне было интересно, могу ли я инициализировать указатель с помощью constinit в С++20, и я не нашел адекватного ответа в Интернете. У меня есть простой код: struct a { const char *s; // pointer I want to initialize int other_random_field; // This is …
1 ответ

Примеры объявления constinit, недостижимого в точке инициализирующего объявления

Из dcl.constinit: Диагностика не требуется, если объявление constinit недоступно в точке объявления инициализации. Что это значит? Думаю, примера будет достаточно. Что-то динамически инициализированное просто неправильно сформировано (из той же ссыл…
26 июн '22 в 20:20
0 ответов

строковые литералы в качестве аргументов шаблона вызывают дублирование и многословие кода

Строка, созданная во время компиляции, используется в качестве массива символов в структуре, и ее максимальный размер определяется этой строкой. Кроме того, эта структура используется в качестве переменной-члена в другой структуре, и в ней есть неск…
08 янв '23 в 20:37
0 ответов

Ветвь с if constexpr() для переменных constinit?

В следующем коде я пытаюсь создать структуру данных constexpr, а затем использовать один из инициализированных элементов constexpr () в методе для ветвления с помощьюif constexpr(). С логической точки зрения AFAIK ничего не говорит против этого: кон…
07 сен '22 в 15:30
0 ответов

Почему constinit разрешает UB?

Скажем, я инициализирую переменные следующим образом: #include <cstdint> constexpr uint16_t a = 65535; constinit int64_t b = a * a; // warning: integer overflow in expression of type 'int' results in '-131071' [-Woverflow] constexpr int64_t c …