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

Сообщение Re: Тема constexpr в классах от 05.04.2026 8:28

Изменено 05.04.2026 8:59 rg45

Re: Тема constexpr в классах
Здравствуйте, LaptevVV, Вы писали:

LVV>Я, конечно, видал разные примеры.

LVV>Но вот какой самый примитивный и простой пример можно придумать?
LVV>Чтоб без этого вот динамического выделения памяти во время компиляции ?
LVV>С конкретными классами (как Страуструп их обзывает) чего-то в голову ничего не приходит...

1) Любой класс стандатной библиотеки, содержащий статический constexpr член value: is_const, is_pointer, is_object, is_function, is_reference, integral_constant и множество других.

Кстати std::integral_constant допускает использование не только с интегральными типами, но и с любыми типами, объекты которых могут быть использованы как нешаблонные параметры шаблонов, например:

using pi = std::integral_constant<double, 3.14>;
using master_version = std::integral_constant<std::array<int, 4>, std::array<int, 4>{3,0}>;



2) Конструкторы и функции члены многих классов стандартной библиотеки объявлены constexpr, что позволяет использовать объекты этих классов во время компиляции, например:

static_assert(std::string("12345").size() == 5);


Или я не уловил суть вопроса.
Re: Тема constexpr в классах
Здравствуйте, LaptevVV, Вы писали:

LVV>Я, конечно, видал разные примеры.

LVV>Но вот какой самый примитивный и простой пример можно придумать?
LVV>Чтоб без этого вот динамического выделения памяти во время компиляции ?
LVV>С конкретными классами (как Страуструп их обзывает) чего-то в голову ничего не приходит...

1) Любой класс стандатной библиотеки, содержащий статический constexpr член value: is_const, is_pointer, is_object, is_function, is_reference, integral_constant и множество других.

Кстати std::integral_constant допускает использование не только с интегральными типами, но и с любыми типами, объекты которых могут быть использованы как нешаблонные параметры шаблонов, например:

using pi = std::integral_constant<double, 3.14>;
using master_version = std::integral_constant<std::array<int, 4>, std::array<int, 4>{3,0}>;

struct A {int id{}, double value {};};
using foo = std::integral_constant<A, A{.id = 42, .value = 3.14}>;



2) Конструкторы и функции члены многих классов стандартной библиотеки объявлены constexpr, что позволяет использовать объекты этих классов во время компиляции, например:

static_assert(std::string("12345").size() == 5);


Или я не уловил суть вопроса.