is_callable
and result_of
is fragileSection: 21.3.3 [meta.type.synop], 21.3.7 [meta.rel] Status: Resolved Submitter: United States Opened: 2017-02-03 Last modified: 2017-03-21
Priority: Not Prioritized
View other active issues in [meta.type.synop].
View all other issues in [meta.type.synop].
View all issues with Resolved status.
Discussion:
Addresses US 85The trick of encoding a functor and argument types as a function signature for is_callable
and
result_of
loses cv information on argument types, fails for non-decayed function types, and is confusing. E.g.,
typedef int MyClass::*mp; result_of_t<mp(const MyClass)>; // should be const, but isn't typedef int F(double); is_callable<F(float)>; // ill-formed
Minimal change:
Replace is_callable<Fn(ArgTypes...)>
with
is_callable<Fn, ArgTypes...>
and replace is_callable<Fn(ArgTypes...), R>
with is_callable_r<R, Fn, ArgTypes...>
.
Do the same for is_nothrow_callable
.
Preferred change:
All of the above, plus deprecate result_of<Fn(ArgTypes...)>
and replace it with
result_of_invoke<Fn, ArgTypes...>
See also LWG 2895.
[2017-02-22, Daniel comments]
LWG 2895 provides now wording for this issue and for LWG 2928 as well.
[2017-02-24, Daniel comments]
I suggest to apply the paper d0604r0 instead, available on the Kona LWG wiki.
[2017-03-12, post-Kona]
Resolved by p0604r0.
Proposed resolution: