§14.10.3 N4553 の制約による部分的な順序付け [temp.constr.order]は、概念と論理演算子で形成された制約式を部分的に順序付けて、オーバーロードの場合に最適な実行可能な関数を選択するために使用する必要があることを指定しています。しかし、これは論理演算子の折り畳み式を使用した制約式にも当てはまりますか?
たとえば、ここであいまいな過負荷エラーを出す 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)