This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 115e. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.
2024-11-11
[Accepted as a DR at the November, 2023 meeting.]
Consider:
#include <type_traits> template<typename T> concept Int = std::is_same_v<T, int>; template<typename T> concept Float = std::is_same_v<T, float>; template<typename T> struct Foo { Foo() requires Int<T> = default; // #1 Foo() requires Int<T> || Float<T> = default; // #2 };
Per the wording, #1 is not eligible for Foo<float>, because the constraints are not satisfied. But #2 also is not eligible, because #1 is more constrained than #2. The intent is that #2 is eligible.
Proposed resolution (approved by CWG 2023-06-17):
Change in 11.4.4 [special] paragraph 6 as follows:
An eligible special member function is a special member function for which:
- the function is not deleted,
- the associated constraints (13.5 [temp.constr]), if any, are satisfied, and
- no special member function of the same kind whose associated constraints, if any, are satisfied is more constrained (13.5.5 [temp.constr.order]).