blockquote>
add_cv_t<T>
иconst volatile T
add_const_t<T>
иconst T
add_volatile_t<T>
иvolatile T
Нет разницы; определение
add_const<T>::type
является, например, толькоT const
.blockquote>
add_lvalue_reference_t<T>
иT&
add_rvalue_reference_t<T>
иT&&
T&
иT&&
плохо сформированы, когдаT
- cvvoid
, но эти шаблоны хорошо сформированы,blockquote>
add_pointer_t<T>
иT*
?
add_pointer_t<T>
эквивалентноstd::remove_reference<T>::type*
. То есть, еслиT
является ссылочным типом, он дает указатель на ссылочный тип. С другой стороны,T*
будет плохо сформирован, так как вы не можете иметь указатель на ссылку.Что вы должны использовать?
- В общем, псевдоним шаблоны могут использоваться для предотвращения вычета
T
. Конечно, это означает, что если вы хотите дедукции, вы должны избегать их.- Шаблоны псевдонимов могут использоваться в качестве аргументов шаблона шаблона для шаблона, который принимает преобразование типа в качестве параметра.
- Шаблоны псевдонимов, которые отличаются поведением от альтернатив, таких как
T*
, полезны в общем коде, поскольку они «делают правильные вещи». Например, еслиT
выводится из аргумента типаT&&
, тогдаT*
делает неправильную вещь, когда аргумент является lvalue, поскольку он пытается объявить указатель на ссылку lvalue. Ноstd::add_pointer_t<T>
даст указатель на фактический тип аргумента.