いくつかの特殊化を伴うクラステンプレートがあるとします
template<typename T> struct A {};
template<typename T> struct A<T const> {};
template<typename T> struct A<T &> {};
A<const int&>
をインスタンス化すると、どの専門化が優先されますか?
GCCでテストを実行し、int&
専門化を選びます。これが規則であると思いますが、これが述べられている場所が見つかりません。
何が起こっているのか見てみましょう。
template<typename T> struct A {}; //primary template
上記のステートメントは,プライマリテンプレートを定義します。これは、それが任意のタイプに使用できることを意味します。
template<typename T> struct A<T const> {};//specialized for T const
上記のステートメントは、専門化プライマリテンプレートのものです。つまり、T const
を専門としています。つまり、この特殊化は、トップレベルのconstを持つテンプレート引数に使用されます。
template<typename T> struct A<T &> {};//specialized for T&
今回は特化フォームのテンプレート引数のプライマリテンプレートT&
です。つまり、LVALUE参照のプライマリテンプレートを専門としています。さらに、LVALUE参照は,ConctまたはA NonConstへの参照であり得る。 これは意味、この特殊化はすべてのlvalue参照に使用されます(T&
_ const T&
)。
今すぐあなたの質問に戻ってきた:
<const int&>をインスタンス化すると、どの専門化が優先されますか?
書くとき
A<const int&>
それから私たちはすでにlvalueの参照のための特定の特定のものを持っています、その特定の特定の特定の特定の特定の特定の特定の特定の特定の特定の特定の説明が述べられています。
const int i = 5;
A<decltype(i)> p;//this will use the T const specialization since the template argument has a top level const