12

http://en.cppreference.com/w/cpp/memory/pointer_traitsおよび関連サイト (boost intrusive による boost の実装) で見られるようにpointer_traitsT*const. 何故ですか?

4

1 に答える 1

8

これは、 forの特殊化が存在する必要があることを指定することに対する強い動機とは言えませんが、それが含まれていなかった理由の説明は、主にテンプレート引数推定 (特に型推定) のコンテキストで使用されることを意図している可能性があると思います。 )が発生します。pointer_traits<>T* constpointer_traits<>

型推定はトップレベルの cv 修飾を無視するためT* const、 orの特殊T* volatileT* 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

于 2013-03-13T12:46:56.873 に答える