2894. The function template std::apply() is required to be constexpr, but std::invoke() isn't

Section: 23.14.4 [func.invoke] Status: Open Submitter: Great Britain Opened: 2017-02-03 Last modified: 2017-07-17

Priority: 3

View other active issues in [func.invoke].

View all other issues in [func.invoke].

View all issues with Open status.

Discussion:

Addresses GB 51

The function template std::apply() in 23.5.3.5 [tuple.apply] is required to be constexpr, but std::invoke() in 23.14.4 [func.invoke] isn't. The most sensible implementation of apply_impl() is exactly equivalent to std::invoke(), so this requires implementations to have a constexpr version of invoke() for internal use, and the public API std::invoke, which must not be constexpr even though it is probably implemented in terms of the internal version.

Proposed change: Add constexpr to std::invoke.

[2017-02-20, Marshall adds wording]

[Kona 2017-03-01]

We think this needs CWG 1581 to work; accepted as Immediate to resolve NB comment.

Friday: CWG 1581 was not moved in Kona. Status back to Open.

[2017-07 Toronto Tuesday PM issue prioritization]

Priority 3

Proposed resolution:

This wording is relative to N4640.

  1. Modify 23.14.4 [func.invoke] as indicated:

    template <class F, class... Args>
         constexpr result_of_t<F&&(Args&&...)> invoke(F&& f, Args&&... args);