Правила для частичного упорядочения по ограничениям относятся к AND и OR, но не относятся к NOT:
13.5.4 Partial ordering by constraints [temp.constr.order]
(1.2) ...
- The constraint A ∧ B subsumes A, but A does not subsume A ∧ B.
- The constraint A subsumes A ∨ B, but A ∨ B does not subsume A.
Эти правила основаны на определения атомы c ограничения и ограничения нормализация :
13.5.3 Constraint normalization [temp.constr.normal]
1 The normal form of an expression E is a constraint that is defined
as follows:
(1.1) The normal form of an expression ( E ) is the normal form of E.
(1.2) The normal form of an expression E1 || E2 is the disjunction
of the normal forms of E1 and E2.
(1.3) The normal form of an expression E1 && E2 is the conjunction
of the normal forms of E1 and E2.
Отрицание (то есть! E1) специально НЕ обрабатывается.
Таким образом, следующий код правильно использует частичное упорядочение:
void foo(auto i) requires std::integral<decltype(i)> {
std::cout << "integral 1" << std::endl;
}
void foo(auto i) requires std::integral<decltype(i)> && true {
std::cout << "integral 2" << std::endl;
}
int main() {
foo(0); // integral 2
}
, в то время как этот код не удается с неоднозначностью:
template<typename T>
concept not_integral = !std::integral<T>;
template<typename T>
concept not_not_integral = !not_integral<T>;
void foo(auto i) requires not_not_integral<decltype(i)> {
std::cout << "integral 1" << std::endl;
}
void foo(auto i) requires std::integral<decltype(i)> && true {
std::cout << "integral 2" << std::endl;
}
int main() {
foo(0);
}
Код: https://godbolt.org/z/RYjqr2
Вышеуказанные причины, по которым закон де Моргана не работает для понятий:
template<class P>
concept has_field_moo_but_not_foo
= has_field_moo<P> && !has_field_foo<P>;
не эквивалентны:
template<class P>
concept has_field_moo_but_not_foo
= !(has_field_foo<P> || !has_field_moo<P>);
, первый будет участвовать в частичном заказ, в то время как последний не будет.
Код: https://godbolt.org/z/aRhmyy
Было решение не обрабатывать отрицание как часть нормализации ограничения , взятые для того, чтобы упростить реализацию для поставщиков компиляторов? или есть логический недостаток при попытке поддержать его?