鉴于:
#include <concepts>
#include <iostream>
template<class T>
struct wrapper;
template<std::signed_integral T>
struct wrapper<T>
{
wrapper() = default;
void print()
{
std::cout << "signed_integral" << std::endl;
}
};
template<std::integral T>
struct wrapper<T>
{
wrapper() = default;
void print()
{
std::cout << "integral" << std::endl;
}
};
int main()
{
wrapper<int> w;
w.print(); // Output : signed_integral
return 0;
}
从上面的代码中,int
有资格都std::integral
和std::signed_integral
概念。
出人意料的是,这会在GCC和MSVC编译器上编译并打印“ signed_integral”。我原以为它会因“已定义模板专业化”而失败,并出现错误。
好的,这很合法,很公平,但是为什么std::signed_integral
选择而不是std::integral
?当多个概念都适合模板参数时,标准中是否定义了选择哪种模板专业化的规则?