ConvertibleTo
rejects conversions from array and function typesSection: 18.4.4 [concept.convertible] Status: Resolved Submitter: Casey Carter Opened: 2018-08-09 Last modified: 2020-11-09
Priority: 3
View other active issues in [concept.convertible].
View all other issues in [concept.convertible].
View all issues with Resolved status.
Discussion:
In the definition of ConvertibleTo
in 18.4.4 [concept.convertible]:
template<class From, class To> concept ConvertibleTo = is_convertible_v<From, To> && requires(From (&f)()) { static_cast<To>(f()); };
f
is an arbitrary function that returns type From
. Since
functions cannot return array or function types (9.3.4.6 [dcl.fct]
paragraph 11), ConvertibleTo
cannot be satisfied when From
is an array or function type regardless
of the type of To
. This is incompatibility with is_convertible_v
was not an intentional design feature, so it should be corrected. (Note that any
change made here must take care to avoid breaking the
ConvertibleTo<T, void>
cases.)
[2018-08-20 Priority set to 3 after reflector discussion]
Previous resolution [SUPERSEDED]:
[Drafting Note: I've used
declval
here, despite that "Concepts mean we never have to usedeclval
again!" because the alternative is less readable:]requires(add_rvalue_reference_t<From> (&f)()) { static_cast<To>(f()); };This wording is relative to N4762.
Modify 18.4.4 [concept.convertible] as follows:
template<class From, class To> concept ConvertibleTo = is_convertible_v<From, To> && requires(From (&f)()){ static_cast<To>(f()declval<From>()); };
[2020-11-09 Resolved for C++20. Status changed: Tentatively Resolved → Resolved.]
Proposed resolution:
This issue is resolved by the resolution of issue 3194.