2013-03-13 3 views
11

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

+0

Я бы сказал, потому что он применяется к переменной, в которой хранится указатель, а не сам объект логического указателя. Для свойств/признаков указателя не имеет значения, как вы его сохраняете. – PlasmaHH

ответ

8

Хотя это не квалифицируется как сильная мотивация против, указав, что специализация pointer_traits<> для T* const должен существовать, я думаю, объяснение, почему он не был включен может быть, что 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 &)' определитель на 'T' не является верхним уровнем,' & 'является верхним уровнем, а любой cv-определитель« на один уровень вниз » –

Смежные вопросы