Spec-Zone.ru › C++

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

См. также

define_static_string
(C++26)
перемещает строку времени компиляции в статическую область памяти и возвращает указатель на её первый символ
(шаблон функции)
define_static_object
(C++26)
перемещает значение времени компиляции в статическую область памяти и возвращает указатель на статический объект
(шаблон функции)
reflect_constant_array
(C++26)
перемещает массив времени компиляции в статическую область памяти и возвращает отражение, представляющее статический массив
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/meta/define_static_array

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API