21 Metaprogramming library [meta]

21.4 Reflection [meta.reflection]

21.4.3 Promoting to static storage strings [meta.define.static]

The functions in this subclause promote compile-time storage into static storage.
template<ranges::input_range R> consteval const ranges::range_value_t<R>* define_static_string(R&& r);
Effects: Equivalent to: return extract<const ranges::range_value_t<R>*>(meta::reflect_constant_string(r));
template<ranges::input_range R> consteval span<const ranges::range_value_t<R>> define_static_array(R&& r);
Effects: Equivalent to: using T = ranges::range_value_t<R>; meta::info array = meta::reflect_constant_array(r); if (is_array_type(type_of(array))) { return span<const T>(extract<const T*>(array), extent(type_of(array))); } else { return span<const T>(); }
template<class T> consteval const remove_cvref_t<T>* define_static_object(T&& t);
Effects: Equivalent to: using U = remove_cvref_t<T>; if constexpr (is_class_type(^^U)) { return addressof(extract<const U&>(meta::reflect_constant(std::forward<T>(t)))); } else { return define_static_array(span(addressof(t), 1)).data(); }
[Note 1: 
For class types, define_static_object provides the address of the template parameter object ([temp.param]) that is template-argument equivalent to t.
— end note]