[concept.convertible] (original) (raw)
18 Concepts library [concepts]
18.4 Language-related concepts [concepts.lang]
18.4.4 Concept convertible_to [concept.convertible]
Given types From and To and an expression Ewhose type and value category are the same as those of declval<From>(),convertible_to<From, To> requires Eto be both implicitly and explicitly convertible to type To.
The implicit and explicit conversions are required to produce equal results.
template<class From, class To> concept [convertible_to](#concept:convertible%5Fto "18.4.4 Concept convertible_to [concept.convertible]") = is_convertible_v<From, To> && requires { static_cast<To>(declval<From>());};
Let FromR be add_rvalue_reference_t<From> andtest be the invented function:To test(FromR (&f)()) { return f();} and let f be a function with no arguments and return type FromRsuch that f() is equality-preserving.
Types From and To model convertible_to<From, To>only if:
- To is not an object or reference-to-object type, orstatic_cast<To>(f()) is equal to test(f).
- FromR is not a reference-to-object type, or
- If FromR is an rvalue reference to a non const-qualified type, the resulting state of the object referenced by f() after either above expression is valid but unspecified ([lib.types.movedfrom]).
- Otherwise, the object referred to by f() is not modified by either above expression.