如何在约束的偏序中使用折叠表达式?

rni*_*ckb 5 c++ language-lawyer c++-concepts fold-expression c++17

§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)
Run Code Online (Sandbox Code Playgroud)

Col*_*mbo 3

当前,在约束 ([temp.constr.order]) 的部分排序过程中不处理折叠表达式。

这可以通过指定原子约束P && ...subsumesQ || ...Q && ...iff Psubsumes来解决Q。在这种情况下,很明显,第一个重载的约束包含在第二个重载的约束中,但反之亦然,从而使后者受到更多约束。

这将通过概念问题#28来解决。