Subject: Re: requires-clause, pack expansion and constraints-ordering
From: Edward Catmur (ecatmur_at_[hidden])
Date: 2021-03-28 07:44:00
You don’t need a(n explicit) pack expansion, or even for the pack to be non-empty. Simplifying your example to the point of absurdity:
template<class> concept Any = true;
template<class T> concept Sub = Any<T> && true;
template<Any = void, Any...> int foo();
template<Sub = void, Any...> int foo();
int x = foo(); // rejects-valid, ambiguous call to overloaded function
I’d class this as a bug in all compilers owing to incomplete coverage of the intersection between concepts and variadics. Yes it’s unusual for all compilers to have the same bug, but it isn’t unheard of.
While playing with concepts and parameter-packs, I tried to expand a
pack inside a requires-clause:
It worked wrt. concept-checking but it failed to create the right
constraints-ordering for overload resolution.
Here is an example, showing the problem: https://godbolt.org/z/onnTYPzzj
According to N4861, [temp.variadic] (10.4) an expansion of a
fold-expression is mere a rewrite.
So, I would have expected, that constraints-ordering also works with
packs, but it seems that clang, gcc and msvc disagree.
Std-Discussion mailing list
STD-DISCUSSION list run by firstname.lastname@example.org
Older Archives on Google Groups