std::define_static_array
Определён в заголовочном файле <meta> | ||
|---|---|---|
template< ranges::input_range R > consteval std::span<const ranges::range_value_t<R>> define_static_array( R&& r ); | (с C++26) |
Перемещает массив в статическую область памяти.
Пусть N будет static_cast<std::size_t>(ranges::size(r)), если ranges::size(r) является константным выражением, и std::dynamic_extent в противном случае. Эффект эквивалентен следующему:
using T = ranges::range_value_t<R>;
std::meta::info array = std::meta::reflect_constant_array(r);
if (std::meta::is_array_type(std::meta::type_of(array)))
return std::span<const T, N>(std::meta::extract<const T*>(array),
std::meta::extent(std::meta::type_of(array)));
else
return std::span<const T, N>(static_cast<const T*>(nullptr), 0);
Параметры
| r | - | input_range, элементы которого копируемы конструированием и имеют структурный тип |
Возвращаемое значение
Если размер r не равен нулю, возвращается span, созданный из массива типа const T[N] (где T — это ranges::range_value_t<R>, а N — размер r). Каждый элемент массива инициализируется значением или объектом, представленным std::meta::reflect_constant(static_cast<T>(*it)), где it — итератор, указывающий на соответствующий элемент r.
В противном случае (если размер r равен нулю) возвращается пустой span.
Примечания
Как объект-параметр шаблона, результирующий объект массива (если он существует) имеет статическую длительность хранения. Диапазоны с содержимым, эквивалентным аргументу шаблона, соответствуют одному и тому же объекту массива.
Объект массива является потенциально неуникальным объектом.
| Макрос проверки наличия функциональности | Значение | Стандарт | Функциональность |
|---|---|---|---|
__cpp_lib_define_static | 202506L | (C++26) |
std::define_static_array |
Пример
#include <algorithm>
#include <meta>
#include <print>
#include <vector>
constexpr std::vector<double> precompute_angles(std::size_t size)
{
std::vector<double> angles(size);
for (int i{}; double& angle : angles)
angle = 360.0 / size * i++;
return angles;
}
consteval std::span<const double> precompute_angles_arr(std::size_t size)
{
std::vector<double> angles = precompute_angles(size);
return std::define_static_array(angles);
}
int main()
{
// std::vector<double> angles = precompute_angles(7);
// error: call to consteval function ‘precompute_angles(7)’ is not a constant
// expression because it refers to a result of ‘operator new’
std::span<const double> angles = precompute_angles_arr(7);
for (double angle : angles)
std::print("{:.1f} ", angle);
std::println();
}
Вывод:
0.0 51.4 102.9 154.3 205.7 257.1 308.6
См. также
|
(C++26) | перемещает строку времени компиляции в статическую область памяти и возвращает указатель на её первый символ (шаблон функции) |
|
(C++26) | перемещает значение времени компиляции в статическую область памяти и возвращает указатель на статический объект (шаблон функции) |
|
(C++26) | перемещает массив времени компиляции в статическую область памяти и возвращает отражение, представляющее статический массив (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/meta/define_static_array