web-dev-qa-db-ja.com

Templateの専門化におけるCV修飾子の部分順序vsポインタ/リファレンス

いくつかの特殊化を伴うクラステンプレートがあるとします

template<typename T> struct A {};
template<typename T> struct A<T const> {};
template<typename T> struct A<T &> {};

A<const int&>をインスタンス化すると、どの専門化が優先されますか?

GCCでテストを実行し、int&専門化を選びます。これが規則であると思いますが、これが述べられている場所が見つかりません。

1
bartgol

何が起こっているのか見てみましょう。

ステートメント1.

template<typename T> struct A {}; //primary template

上記のステートメントは,プライマリテンプレートを定義します。これは、それが任意のタイプに使用できることを意味します。

ステートメント2.

template<typename T> struct A<T const> {};//specialized for T const

上記のステートメントは、専門化プライマリテンプレートのものです。つまり、T constを専門としています。つまり、この特殊化は、トップレベルのconstを持つテンプレート引数に使用されます。

ステートメント3.

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
1
Anoop Rana