重载决议中的约束是否受类型限定符差异的影响?

Are constraints in overload resolution affected by difference it type qualifiers?

具有以下简单代码:

#include <concepts>

auto f(const auto&) { }
auto f(std::integral auto) {}

int main() 
{ 
    f(5); 
}

We have an ambiguous call 使用 clang & gcc,但 MSVC 选择了更受约束的一个。到目前为止,我没有发现任何可以支持 clang 和 gcc 行为的东西。那么它是两个编译器中的错误还是有什么东西使这个调用不明确?

在不考虑约束的情况下,调用是不明确的,因为第一个重载被推导为函数参数类型 const int&,第二个重载推导为 int。当使用 int 类型的纯右值调用时,两者都不会被认为比另一个更好,而且 const auto&auto 也不是更专门用于模板的通常部分排序。

根据[temp.func.order]/6.2.2,如果从模板参数推导中替换后的函数参数类型不对应,则不考虑函数模板的约束。

这里第一个重载将函数参数推导为 const int&,第二个重载推导为 int。这些不相等。因此,基于任何约束,模板的部分排序不会考虑比另一个更专业。