Ответ 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<>
.