std::define_static_array - cppreference.com
来自cppreference.com
template< ranges::input_range R > consteval std::span<const ranges::range_value_t<R>> define_static_array( R&& r ); |
(C++26 起) | |
将数组提升为静态存储。
设 N 为:如果 ranges::size(r) 是常量表达式,则为 static_cast<std::size_t>(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 的大小不为零,则返回一个从类型为 const T[N] 的数组构造的跨度(其中 T 为 ranges::range_value_t<R>,N 为 r 的大小)。数组的每个元素均以 std::meta::reflect_constant(static_cast<T>(*it)) 所表示的值或对象进行初始化,其中 it 是指向 r 中对应元素的迭代器。
否则(r 的大小为零),返回一个空跨度。
注解
作为模板形参对象,结果数组对象(如果存在)具有静态存储期。具有模板实参等价内容的范围对应同一个数组对象。
该数组对象是一个可能非唯一的对象。
| 功能特性测试宏 | 值 | 标准 | 功能特性 |
|---|---|---|---|
__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); // 错误:调用 consteval 函数 ‘precompute_angles(7)’ 不是常量表达式 // 因为它指代了 ‘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