2013-03-13 9 views
11

http://en.cppreference.com/w/cpp/memory/pointer_traitsおよび関連部位(ブースト介入によるブースト実施も示す)に見られるように、pointer_traitsT*constに特化していない。何故ですか?pointer_traitsが "T * const"に対して定義されていないのはなぜですか?

+0

これは、ポインタを格納する変数に適用され、論理ポインタのエンティティ自体には適用されないためです。それはあなたがそれをどのように格納するかについてのポインタの特性/特性については本当に重要ではありません。 – PlasmaHH

答えて

8

これはT* constためpointer_traits<>の専門が存在する必要があることを指定するに強い意欲としての資格はありませんが、私はそれが含まれていなかった理由の説明がpointer_traits<>はほとんどどこコンテキストで使用されることを意図されている可能性があり推測テンプレート引数の控除(特にタイプ控除)が行われます。

型推論は、トップレベルのCV-資格を無視しているので、T* constまたはT* volatileまたはT* const volatileのための専門は、おそらく不要と判断された:もちろん

#include <type_traits> 

template<typename T> 
void foo(T) 
{ 
    static_assert(std::is_same<T, int*>::value, "Error"); // Does not fire! 
//        ^^^^ 
} 

int main() 
{ 
    int x = 0; 
    int* const p = &x; 
    foo(p); 
} 

をこれはT* cvのために専門を持つことで害することを意味するものではありませんこのシナリオでは、なぜこれらのスペシャライゼーションが欠落しているのかを説明することを意味しました。

同様に、iterator_traits<>の特化は、T* cvに対して提供されていません。

+1

私は 'foo(T&)'型の関数テンプレートを持っていて、それは起動します:( –

+0

@Johannes:そうです、トップレベルのcv修飾子が無視されない状況です。 (なぜなら、実際には 'shared_ptr <>'のために実装されているように思われます) –

+0

'foo(T&)' a修飾子'T'はトップレベルではなく、'& 'はトップレベルであり、任意のcv修飾子は「1レベル下」です。 –

関連する問題