2390. [fund.ts] Invocation types and rvalues

Section: 3.3.2 [fund.ts::meta.trans.other] Status: TS Submitter: Michael Spertus Opened: 2014-05-26 Last modified: 2017-07-30

Priority: Not Prioritized

View all other issues in [fund.ts::meta.trans.other].

View all issues with TS status.

Discussion:

Addresses: fund.ts

invocation_type falls short of its stated goals in the following case. Using the notation of Invocation type traits, consider

void f(int const& i);
more_perfect_forwarding_async(f, int(7)); // Oops. Dangling reference because rvalue gone when async runs

This was always the advertised intent of the proposal, but while the language reflects this for the first parameter in the case of a member pointer, it failed to include corresponding language for other parameters.

[2014-06-18, Rapperswil]

Mike Spertus, Richard Smith, Jonathan Wakely, and Jeffrey Yasskin suggest improved wording.

Previous resolution [SUPERSEDED]:

This wording is relative to N3908.

  1. Change Table 3, [meta.trans.other] in the Library TS as indicated:

    Table 3 — Other type transformations
    Template Condition Comments
    template <class Fn, class... ArgTypes>
    struct invocation_type<Fn(ArgTypes...)>;
    Fn and all types in the parameter pack ArgTypes
    shall be complete types, (possibly cv-qualified) void,
    or arrays of unknown bound.
    If A1, A2,... denotes ArgTypes... and
    raw_invocation_type<Fn(ArgTypes...)>::type
    is the function type R(T1, T2, ...) then let Ui be
    decay<Ai>::type if Ai is an rvalue otherwise Ti.
    If
    and Fn is a pointer to member type and T1 is
    an rvalue reference, then let U1 be R(decay<T1>::type,
    T2, ...)
    .
    Otherwise, raw_invocation_type<Fn(ArgTypes...)>::type
    The member typedef type shall equal R(U1, U2, ...).

[2013-06-21 Rapperswil]

Accept for Fundamentals TS Working Paper

Proposed resolution:

This wording is relative to N4023.

  1. Change Table 3, [meta.trans.other] in the Library TS as indicated:

    Table 3 — Other type transformations
    Template Condition Comments
    template <class Fn, class... ArgTypes>
    struct invocation_type<Fn(ArgTypes...)>;
    Fn and all types in the parameter pack ArgTypes
    shall be complete types, (possibly cv-qualified) void,
    or arrays of unknown bound.
    The nested typedef invocation_type<Fn(ArgTypes...)>::type
    shall be defined as follows. If
    raw_invocation_type<Fn(ArgTypes...)>::type
    does not exist, there shall be no member typedef type. Otherwise:
    • Let A1, A2, … denote ArgTypes...

    • Let R(T1, T2, …) denote
      raw_invocation_type_t<Fn(ArgTypes...)>

    • Then the member typedef type shall name the function
      type R(U1, U2, …) where Ui is decay_t<Ai>
      if declval<Ai>() is an rvalue otherwise Ti.

    If raw_invocation_type<Fn(ArgTypes...)>::type
    is the function type R(T1, T2, …)
    and Fn is a pointer to member type and T1 is
    an rvalue reference, then R(decay<T1>::type,
    T2, …)
    .
    Otherwise, raw_invocation_type<Fn(ArgTypes...)>::type.