约束的部分排序中如何使用折叠表达式?
How are fold expressions used in the partial ordering of constraints?
§14.10.3 按 N4553 的约束 [temp.constr.order] 的偏序指定由概念和逻辑运算符构成的约束表达式应该偏序并用于 select 在重载情况下最好的可行函数。但这是否也适用于使用逻辑运算符的折叠表达式的约束表达式?
例如,gcc 给出不明确的重载错误是否正确 here 或者代码是否有效,打印 "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)
折叠表达式当前在按约束进行部分排序期间未处理 ([temp.constr.order])。
这可以通过指定原子约束 P && ...
包含 Q || ...
和 Q && ...
iff P
包含 Q
来解决。在那种情况下,很明显,第一个重载的约束包含在第二个重载的约束中,但反之则不然,从而使后者受到更多约束。
这将通过概念问题 #28 解决。
§14.10.3 按 N4553 的约束 [temp.constr.order] 的偏序指定由概念和逻辑运算符构成的约束表达式应该偏序并用于 select 在重载情况下最好的可行函数。但这是否也适用于使用逻辑运算符的折叠表达式的约束表达式?
例如,gcc 给出不明确的重载错误是否正确 here 或者代码是否有效,打印 "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)
折叠表达式当前在按约束进行部分排序期间未处理 ([temp.constr.order])。
这可以通过指定原子约束 P && ...
包含 Q || ...
和 Q && ...
iff P
包含 Q
来解决。在那种情况下,很明显,第一个重载的约束包含在第二个重载的约束中,但反之则不然,从而使后者受到更多约束。
这将通过概念问题 #28 解决。