Подтвердить что ты не робот

Почему pointer_traits не определен для "T * const"?

Как видно на http://en.cppreference.com/w/cpp/memory/pointer_traits и связанных сайтах (также ускорение реализации путем навязчивости), pointer_traits не специализируется на T*const. Почему это?

4b9b3361

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