any_cast<void>
Section: 22.7.5 [any.nonmembers] Status: WP Submitter: John Shaw Opened: 2019-10-16 Last modified: 2023-11-22
Priority: 2
View all other issues in [any.nonmembers].
View all issues with WP status.
Discussion:
any foo; void* p = any_cast<void>(&foo);
Per 22.7.5 [any.nonmembers]/9, since the operand isn't nullptr
and
operand->type() == typeid(T)
(because T = void
in this case), we should
return a pointer to the object contained by operand
. But there is no such object.
T = void
case, probably by just explicitly returning nullptr
.
[2019-11 Priority to 2 during Monday issue prioritization in Belfast. There is implementation divergence here.]
[2020-02 LWG discussion in Prague did not reach consensus. Status to Open.]
There was discussion about whether or not any_cast<void>(a)
should be ill-formed, or return nullptr
.
Poll "should it return nullptr" was 0-4-5-5-1.
[2022-02 Currently ill-formed in MSVC ("error C2338: std::any cannot contain void") and returns null pointer in libstdc++ and libc++.]
Previous resolution [SUPERSEDED]:
This wording is relative to N4835.
Modify 22.7.5 [any.nonmembers] as indicated:
template<class T> const T* any_cast(const any* operand) noexcept; template<class T> T* any_cast(any* operand) noexcept;-9- Returns: If
[…]operand != nullptr && operand->type() == typeid(T) && is_object_v<T>
, a pointer to the object contained byoperand
; otherwise,nullptr
.
[2023-06-14 Varna; Jonathan provides improved wording]
[2023-06-14 Varna; Move to Ready]
Poll: 7-0-1
[2023-11-11 Approved at November 2023 meeting in Kona. Status changed: Voting → WP.]
Proposed resolution:
This wording is relative to N4950.
Modify 22.7.5 [any.nonmembers] as indicated:
template<class T> const T* any_cast(const any* operand) noexcept; template<class T> T* any_cast(any* operand) noexcept;-8- Mandates:
is_void_v<T>
isfalse
.-9- Returns: If
[…]operand != nullptr && operand->type() == typeid(T)
istrue
, a pointer to the object contained byoperand
; otherwise,nullptr
.