Какие новые типы и операции могут появиться в constexpr в C23?

В C23 добавлено ключевое слово constexpr, которое можно использовать для определения объектов как констант времени компиляции вместо перечислений или макросов. Например:

constexpr int x = 10;
constexpr int y = x+10; // Valid

switch (some_var) {
    case y: // Valid
        // ...
}
static int z = y; // Valid

Раньше только целочисленные константы (sizeof() или enum или литеральные значения, такие как 10) или адреса глобальных/static объектов можно было рассматривать как константы времени компиляции/трансляции, и во время компиляции над ними можно было выполнять несколько арифметических операций.

Есть ли какие-либо новые операции и типы, которые можно обрабатывать в выражении constexpr в C23? Каковы ограничения?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
109
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Составные литералы

constexpr можно использовать для определения составного литерала:

Составной литерал со спецификатором класса хранения constexpr является составной литеральной константой. Составная литеральная константа — это постоянное выражение с типом и значением безымянного объекта.

До C23 не было поддержки составных литералов с константой времени компиляции (или даже static), даже если все их члены были константами времени компиляции:

static int x = (int){0}; // Non-portable
static int x = (constexpr int){0}; // Valid C23

struct и union

Начиная со структуры или константы объединения, оператор доступа к члену . может использоваться для формирования именованной константы [...].

constexpr можно комбинировать с struct или union для создания объекта константы времени компиляции. Члены могут быть прочитаны во время компиляции:

constexpr struct {
    int x;
} s = {10};
static int x = s.x; // Valid

Однако это не позволяет каламбура во время компиляции:

Если оператор доступа к члену . обращается к члену константы объединения, доступный член должен быть тем же самым, что и член, который инициализируется инициализатором константы объединения.

Массивы

Невозможно получить доступ к значению любого члена массива во время компиляции:

Операторы индекса массива [] и доступа к члену ->, унарные операторы адреса & и косвенности *, а также приведения указателей могут использоваться при создании адресной константы, но доступ к значению объекта с помощью этих операторов невозможен. .

Но эти операторы можно использовать для генерации адреса одного из членов массива в качестве константы времени компиляции.

Функции

Функции constexpr в стиле C++ не поддерживаются. Таким образом, в выражении constexpr нельзя использовать вызов функции.

Неподдерживаемые операции

Константные выражения не должны содержать операторы присваивания, увеличения, уменьшения, вызова функции или запятую, за исключением случаев, когда они содержатся в подвыражении, которое не оценивается.

Другие вопросы по теме

Использование лямбда-функции в конструкторе constexpr с std::tie
Как создать список инициализаторов для конструктора аргументов с переменным числом аргументов из std::array
Использование constexpr для оценок во время выполнения и во время компиляции — передача значения constexpr в качестве параметра функции
Как получить контейнер произвольного доступа со стандартными диапазонами во время компиляции?
C++ помечает арифметическую жестко запрограммированную дробь как constexpr в однострочном виде
Использование константных выражений в качестве параметра шаблона с использованием параметра функции: какой компилятор прав?
Пользовательское шифрование строк работает с некоторыми строками, но, как ни странно, не работает с другими?
C++ constexpr и почему мы используем константные выражения
Почему адрес локальной переменной constexpr не является постоянным выражением?
Невозможно использовать функцию constexpr вложенного класса