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

§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)

4

Решение

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

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

Это будет решено через проблему концепций # 28.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]