重载决议中的约束是否受类型限定符差异的影响?
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
。这些不相等。因此,基于任何约束,模板的部分排序不会考虑比另一个更专业。
具有以下简单代码:
#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
。这些不相等。因此,基于任何约束,模板的部分排序不会考虑比另一个更专业。