The class template constant_wrapper aids in metaprogramming by ensuring
that the evaluation of expressions comprised entirely of constant_wrapper
are core constant expressions ([expr.const.core]),
regardless of the context in which they appear.
In particular, this enables use of constant_wrapper values
that are passed as arguments to constexpr functions to be used in constant expressions.
The second template parameter to constant_wrapper is present
to aid argument-dependent lookup ([basic.lookup.argdep])
in finding overloads for which constant_wrapper's wrapped value is a suitable argument,
but for which the constant_wrapper itself is not.
Let call-expr be
constant_wrapper<INVOKE(value, remove_cvref_t<Args>::value...)>{}
if all types in remove_cvref_t<Args>... satisfy constexpr-param and
constant_wrapper<INVOKE(value, remove_cvref_t<Args>::value...)> is a valid type,
otherwise let call-expr be INVOKE(value, std::forward<Args>(args)...).
Let subscr-expr be
constant_wrapper<value[remove_cvref_t<Args>::value...]>{}
if all types in remove_cvref_t<Args>... satisfy constexpr-param and
constant_wrapper<value[remove_cvref_t<Args>::value...]> is a valid type,
otherwise let subscr-expr be value[std::forward<Args>(args)...].