template is considered more constrained even though function parameters are not of the same type · Issue #53640 · llvm/llvm-project (original) (raw)
template
concept SmallVar = (sizeof(T) <= sizeof(int));
void print(SmallVar auto t) {
std::cout << t << std::endl;
}
void print(const auto& t) {
std::cout << t << std::endl;
}
int main() {
print(6); // clang accepts, gcc sees here ambiguity
}
https://godbolt.org/z/P89dPsaKa
It seems that gcc is right in rejecting the code on ambiguity, as the function parameters that positionally correspond between the two templates are not of the same type - thus neither template should be more specialized than the other.
https://eel.is/c++draft/temp.func.order#6.2.2:
Otherwise, [...] or if the function parameters that positionally correspond between the two templates are not of the same type, neither template is more specialized than the other.