This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of WP status.
Section: 22.10.6.5 [refwrap.invoke] Status: WP Submitter: Zhihao Yuan Opened: 2022-08-31 Last modified: 2022-11-17
Priority: Not Prioritized
View all other issues in [refwrap.invoke].
View all issues with WP status.
Discussion:
The following assertion does not hold, making the type less capable than the function pointers.
void f() noexcept; std::reference_wrapper fn = f; static_assert(std::is_nothrow_invocable_v<decltype(fn)>);
[2022-09-23; Reflector poll]
Set status to Tentatively Ready after six votes in favour during reflector poll.
Already implemented in MSVC and libstdc++.
[2022-11-12 Approved at November 2022 meeting in Kona. Status changed: Voting → WP.]
Proposed resolution:
This wording is relative to N4910.
Modify 22.10.6.1 [refwrap.general], class template reference_wrapper synopsis, as indicated:
// 22.10.6.5 [refwrap.invoke], invocation template<class... ArgTypes> constexpr invoke_result_t<T&, ArgTypes...> operator()(ArgTypes&&...) const noexcept(is_nothrow_invocable_v<T&, ArgTypes...>);
Modify 22.10.6.5 [refwrap.invoke] as indicated:
template<class... ArgTypes> constexpr invoke_result_t<T&, ArgTypes...> operator()(ArgTypes&&... args) const noexcept(is_nothrow_invocable_v<T&, ArgTypes...>);-1- Mandates: T is a complete type.
-2- Returns: INVOKE(get(), std::forward<ArgTypes>(args)...). (22.10.4 [func.require])