Как видно на http://en.cppreference.com/w/cpp/memory/pointer_traits и связанных сайтах (также ускорение реализации путем навязчивости), pointer_traits
не специализируется на T*const
. Почему это?
Почему pointer_traits не определен для "T * const"?
Ответ 1
Хотя это не квалифицируется как сильная мотивация против указания того, что специализация pointer_traits<>
для T* const
должна существовать, я думаю, объяснение, почему оно не было включено, может заключаться в том, что pointer_traits<>
в основном предназначено для использования в контекст, в котором вычитается аргумент шаблона (и, в частности, вывод типа).
Поскольку вывод типа игнорирует квалификацию высшего уровня, специализация для 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
может повредить в этом сценарии, я просто хотел дать возможное объяснение того, почему эти специализации отсутствуют.
Аналогично, для T* cv
не предоставляется специализация iterator_traits<>
.