与えられた:
#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
ですか?複数の概念がテンプレート引数に適格である場合に、どのテンプレート特殊化が選択されるかについて、標準で定義されているルールはありますか?