§14.10.3 Частичное упорядочение по ограничениям [temp.constr.order] из N4553 указывает, что выражения ограничений, сформированные из понятий и логических операторов, должны быть частично упорядочены и использованы для выбора наилучшей жизнеспособной функции в случаях перегрузки. Но относится ли это также к выражениям ограничения, использующим выражения сгиба логических операторов?
Например, правильно ли gcc выдавать неоднозначную ошибку перегрузки Вот или код действителен, печатая «с»?
template <class T> concept bool A = std::is_move_constructible<T>::value;
template <class T> concept bool B = std::is_copy_constructible<T>::value;
template <class T> concept bool C = A<T> && B<T>;
template <class... _tx>
requires (A<_tx> && ...)
void g(_tx... tx) {
std::cout << "a\n";
}
template <class... _tx>
requires (C<_tx> && ...)
void g(_tx... tx) {
std::cout << "c\n";
}
f(3, 2.0)
Выражения сгиба в настоящее время не обрабатываются при частичном упорядочении по ограничениям ([temp.constr.order]).
Это можно исправить, указав, что атомное ограничение P && ...
вбирает Q || ...
а также Q && ...
тогда и только тогда P
вбирает Q
, В этом случае довольно очевидно, что ограничения первой перегрузки включаются во вторую, но не наоборот, что делает последние более ограниченными.
Это будет решено через проблему концепций # 28.
Других решений пока нет …