Как видно на http://en.cppreference.com/w/cpp/memory/pointer_traits и связанных с ним сайтах (также реализация бустеров путем наложения инкрустировки), pointer_traits
не специализируется на T*const
. Почему это?Почему pointer_traits не определен для "T * const"?
ответ
Хотя это не квалифицируется как сильная мотивация против, указав, что специализация 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
.
У меня есть шаблон функции типа 'foo (T &)', и он срабатывает :( –
@Johannes: Да, это ситуация, когда квалификаторы cv верхнего уровня не игнорируются. Чтобы уточнить, я только пытался дать возможность объяснение того, почему специализации нет, я не сторонник того, что он не должен быть там (на самом деле реализации, похоже, предоставляют его для 'shared_ptr <>'). –
В 'foo (T &)' определитель на 'T' не является верхним уровнем,' & 'является верхним уровнем, а любой cv-определитель« на один уровень вниз » –
- 1. Почему const T * не может связываться с T *?
- 2. T * и const T *
- 3. «const const T» в шаблоне
- 4. Удаление указателя на const (T const *)
- 5. Использовать T const & или T &&
- 6. Почему MB_CUR_MAX не определен?
- 7. Возвращает «const T» из «T :: operator + (const T & rhs) const« хорошая практика?
- 8. Любые идеи, почему QHash и QMap возвращают const T вместо const T &?
- 9. «const T & arg» vs. «T arg»
- 10. const T * search (const T &) return not working
- 11. Почему const lvalues связывают иначе, чем константы, заданные T && и const T & overloads?
- 12. Что означает const T & value() const?
- 13. Разница между статическим T const и static const T
- 14. Почему Equatable не определен для дополнительных массивов
- 15. static const член структуры не определен
- 16. Почему const для неявного преобразования?
- 17. Имеет ли размерof (T) == sizeof (const T) и alignof (T) == alignof (const T)
- 18. Почему this.state.records.amount не определен?
- 19. C++ "const T & const" В чем смысл второго const?
- 20. Почему const в const const исчезает, когда T является ссылочным типом?
- 21. Функция для преобразования из T в const T в C++
- 22. Почему Const не работает
- 23. Значение const T, если T - тип указателя?
- 24. Почему «const int *» указывает на не const const?
- 25. Почему AppEventsLogger.logEvent не определен?
- 26. Почему y не определен?
- 27. Почему Parse не определен?
- 28. Почему Math.prototype не определен?
- 29. почему не-const ptr не может неявно использовать ptr для const в качестве параметра в шаблоне
- 30. const вектор <T> * какая часть const?
Я бы сказал, потому что он применяется к переменной, в которой хранится указатель, а не сам объект логического указателя. Для свойств/признаков указателя не имеет значения, как вы его сохраняете. – PlasmaHH