2012-03-13 7 views

答えて

22

§14.1 [temp.param] p5

[...]そのタイプを決定するときテンプレートパラメータの最上位CV-修飾子が無視されます。

+0

これは 'typename'パラメータの種類だけですか? (私の答えを見てください)。私は標準にアクセスすることができず、私の草案で有益な情報を見つけるのは悪いです。 –

+2

@ J.N .:いいえ、この引用符は具体的には非型テンプレートパラメータを参照しています(あなたは 'const typename'を使用することはできません:P)。 – Xeo

+1

+1受け入れられた答えよりも多くの票を獲得しています。 – ApprenticeHacker

5

私は、これが標準の迅速な検索を行うことが見つかりました:

template<const short cs> class B { }; 
template<short s> void g(B<s>); 
void k2() { 
    B<1> b; 
    g(b); // OK: cv-qualifiers are ignored on template parameter types 
} 

コメントは、それらが無視されていると言います。

テンプレートパラメータにconstを使用しないことをお勧めします。これは、暗黙のものでもなく、constとは異なる定数式です。

+0

コメントは規範的ではありません。 –

2

intの選択は、おそらく悪い考えだった、それはしかし、ポインタのための違い:

class A 
{ 
public: 
    int Counter; 
}; 

A a; 


template <A* a> 
struct Coin 
{ 
    static void DoStuff() 
    { 
     ++a->Counter; // won't compile if using const A* !! 
    } 
}; 

Coin<&a>::DoStuff(); 
cout << a.Counter << endl; 
+0

他の人の答えを信じるならば、私のコンパイラ(GCC 4.6.1/ubuntu)と標準ではうんざりしているようです。/ –

+0

心配する必要はありません。私は標準を誤解しているかもしれません。そして、@ Pubbyの答えは、テンプレートと一致するときに無視されることを示しています。 – Xeo

+6

'const A *'は 'const *'の 'const'修飾バージョンではありません。それは無関係のタイプです。 'A * const'は' A * 'の' const'修飾バージョンです。 –

関連する問題

 関連する問題