2.0 KiB
[diff.cpp23.temp]
Annex C (informative) Compatibility [diff]
C.1 C++ and ISO C++ 2023 [diff.cpp23]
C.1.5 [temp]: templates [diff.cpp23.temp]
Affected subclause: [temp.constr]
Change: Some atomic constraints become fold expanded constraints.
Rationale: Permit the subsumption of fold expressions.
Effect on original feature: Valid C++ 2023 code may become ill-formed.
[Example 1: template <typename ...V> struct A;struct S {static constexpr int compare(const S&) { return 1; }};
template <typename ...T, typename ...U>void f(A<T ...> *, A<U ...> *)requires (T::compare(U{}) && ...); // was well-formed (atomic constraint of type bool),// now ill-formed (results in an atomic constraint of type int)void g(A<S, S> *ap) { f(ap, ap);} â end example]
Affected subclause: [temp.deduct.call]
Change: Template argument deduction from overload sets succeeds in more cases.
Rationale: Allow consideration of constraints to disambiguate overload sets used as parameters in function calls.
Effect on original feature: Valid C++ 2023 code may become ill-formed.
[Example 2: template void f(T &&, void (*)(T &&));
void g(int &); // #1inline namespace A {void g(short &&); // #2}inline namespace B {void g(short &&); // #3}void q() {int x; f(x, g); // ill-formed; previously well-formed, deducing T = int&}
There is no change to the applicable deduction rules for the individual g candidates: Type deduction from #1 does not succeed; type deductions from #2 and #3 both succeed.
â end example]