std::to_address
overload constexpr
Section: 20.2.4 [pointer.conversion] Status: C++20 Submitter: Billy O'Neal III Opened: 2020-01-14 Last modified: 2021-02-25
Priority: 0
View all other issues in [pointer.conversion].
View all issues with C++20 status.
Discussion:
While reviewing some interactions with P0653 +
P1006, Billy discovered that one of the overloads was
missing the constexpr
tag. This might be a typo or a missed merge interaction between
P0653 (which adds to_address
with the pointer overload being constexpr
) and
P1006 (which makes pointer_traits::pointer_to constexpr
). Mail was sent the LWG reflector,
and Glen Fernandes, the author of P0653, indicates that this might have been an oversight.
[2020-02-01 Status set to Tentatively Ready after seven positive votes on the reflector.]
Proposed resolution:
This wording is relative to N4842.
Modify 20.2.2 [memory.syn], header <memory>
synopsis, as indicated:
[…] // 20.2.4 [pointer.conversion], pointer conversion template<class T> constexpr T* to_address(T* p) noexcept; template<class Ptr> constexpr auto to_address(const Ptr& p) noexcept; […]
Modify 20.2.4 [pointer.conversion] as indicated:
template<class Ptr> constexpr auto to_address(const Ptr& p) noexcept;-3- Returns:
pointer_traits<Ptr>::to_address(p)
if that expression is well-formed (see 20.2.3.4 [pointer.traits.optmem]), otherwiseto_address(p.operator->())
.