Title
function/packaged_task deduction guides and deducing this
Status
new
Section
[func.wrap.func.con][futures.task.members]
Submitter
Barry Revzin

Created on 2021-10-09.00:00:00 last changed 3 days ago

Messages

Date: 2021-10-17.11:01:02

Proposed resolution:

This wording is relative to N4892.

  1. Modify [func.wrap.func.con] as indicated:

    template<class F> function(F) -> function<see below>;
    

    -16- Constraints: &F::operator() is well-formed when treated as an unevaluated operand and decltype(&F::operator()) is either of the form R(G::*)(A...) cv &opt noexceptopt or of the form R(*)(G, A...) noexceptopt for a class type G.

    -17- Remarks: The deduced type is function<R(A...)>.

  2. Modify [futures.task.members] as indicated:

    template<class F> packaged_task(F) -> packaged_task<see below>;
    

    -7- Constraints: &F::operator() is well-formed when treated as an unevaluated operand and decltype(&F::operator()) is either of the form R(G::*)(A...) cv &opt noexceptopt or of the form R(*)(G, A...) noexceptopt for a class type G.

    -8- Remarks: The deduced type is packaged_task<R(A...)>.

Date: 2021-10-15.00:00:00

[ 2021-10-17; Improved wording based on Tim Song's suggestion ]

Date: 2021-10-15.00:00:00

[ 2021-10-14; Reflector poll ]

Set priority to 2 after reflector poll.

Previous resolution [SUPERSEDED]:

This wording is relative to N4892.

  1. Modify [func.wrap.func.con] as indicated:

    template<class F> function(F) -> function<see below>;
    

    -16- Constraints: &F::operator() is well-formed when treated as an unevaluated operand and decltype(&F::operator()) is either of the form R(G::*)(A...) cv &opt noexceptopt or of the form R(*)(G cv &opt, A...) noexceptopt for a class type G.

    -17- Remarks: The deduced type is function<R(A...)>.

  2. Modify [futures.task.members] as indicated:

    template<class F> packaged_task(F) -> packaged_task<see below>;
    

    -7- Constraints: &F::operator() is well-formed when treated as an unevaluated operand and decltype(&F::operator()) is either of the form R(G::*)(A...) cv &opt noexceptopt or of the form R(*)(G cv &opt, A...) noexceptopt for a class type G.

    -8- Remarks: The deduced type is packaged_task<R(A...)>.

Date: 2021-10-09.00:00:00

With the adoption of deducing this (P0847), we can now create types whose call operator is an explicit object member function, which means that decltype(&F::operator()) could have pointer-to-function type rather than pointer-to-member-function type. This means that the deduction guides for std::function ([func.wrap.func.con]) and std::packaged_task ([futures.task.members]) will simply fail:

struct F {
  int operator()(this const F&) { return 42; }
};

std::function g = F{}; // error: decltype(&F::operator()) is not of the form R(G::*)(A...) cv &opt noexceptopt

We should update the deduction guides to keep them in line with the core language.

History
Date User Action Args
2021-10-17 11:01:02adminsetmessages: + msg12174
2021-10-14 11:35:36adminsetmessages: + msg12171
2021-10-10 11:11:03adminsetmessages: + msg12106
2021-10-09 00:00:00admincreate