具有以下简单代码:
#include <concepts>
auto f(const auto&) { }
auto f(std::integral auto) {}
int main()
{
f(5);
}我们接到一个含糊不清的电话与clang & gcc,但MSVC选择了更多的约束。到目前为止,我还没有发现任何证据支持gcc的行为。那么,这是两个编译器中的一个bug,还是有某种原因使这个调用变得模糊不清?
发布于 2022-05-16 09:35:28
在不考虑约束的情况下,调用是模棱两可的,因为第一次重载被推演为函数参数类型const int&,而第二次重载被推导为int。当使用int类型的prvalue调用时,两者都不会被认为比另一个更好,而且在模板的通常偏序方面,const auto&或auto也不是更专门化的。
根据[temp.func.order]/6.2.2对函数模板的约束,如果从模板参数替换后的函数参数类型不对应,则不考虑模板的约束。
这里,第一个重载将函数参数推导为const int&,第二个重载推导为int。这是不平等的。因此,模板的偏序也不会比基于任何约束的模板更专业化。
https://stackoverflow.com/questions/72256841
复制相似问题