Как выражения сгиба используются при частичном упорядочении ограничений?

§14.10.3 Частичное упорядочение по ограничениям [temp.constr.order] N4553 указывает, что выражения ограничений, сформированные из понятий и логических операторов, должны быть частично упорядочены и использованы для выбора наилучшей жизнеспособной функции в случаях перегрузки. Но относится ли это также к выражениям ограничения, использующим выражения сгиба логических операторов?

Например, корректен ли gcc для выдачи здесь неоднозначной ошибки перегрузки или код корректен и выдает "c"?

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)

1 ответ

Решение

Выражения сгиба в настоящее время не обрабатываются при частичном упорядочении по ограничениям ([temp.constr.order]).

Это можно исправить, указав, что атомное ограничение P && ... вбирает Q || ... а также Q && ... тогда и только тогда P вбирает Q, В этом случае довольно очевидно, что ограничения первой перегрузки включаются во вторую, но не наоборот, что делает последние более ограниченными.

Это будет решено с помощью концепции № 28.

Другие вопросы по тегам