std::define_static_array
来自 zh.cppreference.net
| 定义于头文件 <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,其元素可复制构造并拥有 structural type |
返回值
若 r 的大小不为零,则返回从类型 const T[N] 的数组构造的 span(其中 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) |
将编译时数组提升到静态存储,返回表示静态数组的反射 (函数模板) |