This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of TS status.

### 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`.

   > - […]