2539. [fund.ts.v2] invocation_trait definition definition doesn't work for surrogate call functions

Section: 3.3.2 [fund.ts.v2::meta.trans.other] Status: TS Submitter: Mike Spertus Opened: 2015-09-25 Last modified: 2017-07-30

Priority: Not Prioritized

View all issues with TS status.

Discussion:

Addresses: fund.ts.v2

In Library Fundamentals 2 (N4529) 3.3.2p3 [meta.trans.other], the definition of invocation traits for a class object f considers when f is called via a function call operator that is matched by the arguments but ignores the possibility that f may be called via a surrogate call function (C++14 12.2.2.2.3 [over.call.object] p2), in which case, the definition of the invocation parameters may be either incorrect or even unsatisfiable.

[2015-10, Kona Saturday afternoon]

AM: Do we have this trait yet? JW: No, it cannot be implemented without compiler support.

Move to tentatively ready

Proposed resolution:

This wording is relative to N4529.

  1. In Library Fundamentals 2, change [meta.trans.other] as indicated:

    -3- Within this section, define the invocation parameters of INVOKE(f, t1, t2, ..., tN) as follows, in which T1 is the possibly cv-qualified type of t1 and U1 denotes T1& if t1 is an lvalue or T1&& if t1 is an rvalue:

    • […]

    • If f is a class object, the invocation parameters are the parameters matching t1, ..., tN of the best viable function (C++14 §13.3.3) for the arguments t1, ..., tN among the function call operators and surrogate call functions of f.

    • […]