From 98ad67455a61908090cd8b2b4d2b8e7d418538a2 Mon Sep 17 00:00:00 2001 From: Matthias Kretz Date: Sat, 28 Mar 2026 17:36:13 +0000 Subject: [PATCH] P3978R3 constant_wrapper should unwrap on call and subscript --- source/meta.tex | 73 +++++++++++++++++++++++++++++++++++++++------- source/support.tex | 2 +- 2 files changed, 64 insertions(+), 11 deletions(-) diff --git a/source/meta.tex b/source/meta.tex index 48510a4e39..bf6c2c461c 100644 --- a/source/meta.tex +++ b/source/meta.tex @@ -797,16 +797,6 @@ friend constexpr auto operator->*(L, R) noexcept -> constant_wrapper*(R::value)> { return {}; } - // call and index - template<@\exposconcept{constexpr-param}@ T, @\exposconcept{constexpr-param}@... Args> - constexpr auto operator()(this T, Args...) noexcept - requires requires { constant_wrapper(); } - { return constant_wrapper{}; } - template<@\exposconcept{constexpr-param}@ T, @\exposconcept{constexpr-param}@... Args> - constexpr auto operator[](this T, Args...) noexcept - -> constant_wrapper<(T::value[Args::value...])> - { return {}; } - // pseudo-mutators template<@\exposconcept{constexpr-param}@ T> constexpr auto operator++(this T) noexcept @@ -864,6 +854,11 @@ -> constant_wrapper { return {}; } constexpr operator decltype(auto)() const noexcept { return value; } + + template + static constexpr decltype(auto) operator()(Args&&... args) noexcept(@\seebelow@); + template + static constexpr decltype(auto) operator[](Args&&... args) noexcept(@\seebelow@); }; } \end{codeblock} @@ -926,6 +921,64 @@ Initialize elements of \exposid{data} with corresponding elements of \tcode{arr}. \end{itemdescr} +\indexlibrarymember{operator()}{constant_wrapper}% +\begin{itemdecl} +template + static constexpr decltype(auto) operator()(Args&&... args) noexcept(@\seebelow@); +\end{itemdecl} + +\begin{itemdescr} +\pnum +Let \tcode{\placeholder{call-expr}} be +\tcode{constant_wrapper<\placeholder{INVOKE}(value, +remove_cvref_t::value...)>\{\}} if all types in +\tcode{remove_cvref_t...} satisfy \exposconcept{constexpr-param} and +\tcode{constant_wrapper<\placeholder{INVOKE}(val\-ue, +remove_cvref_t::value...)>} is a valid type, otherwise let +\tcode{\placeholder{call-expr}} be \tcode{\placeholder{INVOKE}(value, +std::forward(args)...)}. + +\pnum +\constraints +\tcode{\placeholder{call-expr}} is a valid expression. + +\pnum +\effects +Equivalent to: \tcode{return \placeholder{call-expr};} + +\pnum +\remarks +The exception specification is equivalent to \tcode{noexcept(\placeholder{call-expr})}. +\end{itemdescr} + +\indexlibrarymember{operator[]}{constant_wrapper}% +\begin{itemdecl} +template + static constexpr decltype(auto) operator[](Args&&... args) noexcept(@\seebelow@); +\end{itemdecl} + +\begin{itemdescr} +\pnum +Let \tcode{\placeholder{subscr-expr}} be +\tcode{constant_wrapper::value...]>\{\}} if all +types in \tcode{remove_cvref_t...} satisfy \exposconcept{constexpr-param} +and \tcode{constant_wrapper::value...]>} is a valid +type, otherwise let \tcode{\placeholder{subscr-expr}} be +\tcode{value[std::forward(args)...]}. + +\pnum +\constraints +\tcode{\placeholder{subscr-expr}} is a valid expression. + +\pnum +\effects +Equivalent to: \tcode{return \placeholder{subscr-expr};} + +\pnum +\remarks +The exception specification is equivalent to \tcode{noexcept(\placeholder{subscr-expr})}. +\end{itemdescr} + \rSec2[meta.unary]{Unary type traits} \rSec3[meta.unary.general]{General} diff --git a/source/support.tex b/source/support.tex index f4f632944b..a2639f9af2 100644 --- a/source/support.tex +++ b/source/support.tex @@ -620,7 +620,7 @@ #define @\defnlibxname{cpp_lib_complex_udls}@ 201309L // also in \libheader{complex} #define @\defnlibxname{cpp_lib_concepts}@ 202207L // freestanding, also in \libheader{concepts}, \libheader{compare} -#define @\defnlibxname{cpp_lib_constant_wrapper}@ 202506L // freestanding, also in \libheader{type_traits} +#define @\defnlibxname{cpp_lib_constant_wrapper}@ 202603L // freestanding, also in \libheader{utility} #define @\defnlibxname{cpp_lib_constexpr_algorithms}@ 202306L // also in \libheader{algorithm}, \libheader{utility} #define @\defnlibxname{cpp_lib_constexpr_atomic}@ 202411L // also in \libheader{atomic} #define @\defnlibxname{cpp_lib_constexpr_bitset}@ 202207L // also in \libheader{bitset}