Почему decltype требуется в C++11?
Я учусь "decltype" в C++ 11.
Функция "auto" и "decltype" кажется дублированной, и я не понимаю, зачем нам нужен "decltype".
Согласно вики, его основное предназначение - в общем программировании, где часто трудно или даже невозможно выразить типы, которые зависят от параметров шаблона.
В общем программировании я могу использовать "авто", когда трудно выразить типы:
template <typename T>
void MakeAnObject (const T& builder)
{
auto val = builder.MakeObject();
// do stuff with val
}
Я не понимаю, почему требуется "decltype".
Может ли "decltype" делать то, что "авто" не может?
Заранее спасибо.
3 ответа
auto
означает "тип переменной выводится из инициализатора".
decltype
ссылается на тип в произвольном контексте.
Вот пример, где вы не можете использовать auto
:
template <typename T, typename U, typename V>
void madd(const T &t, const U &u, const V &v, decltype(t * u + v) &res)
{
res = t * u + v;
}
В объявлении параметра нет инициализатора (и его не может быть), поэтому вы не можете использовать auto
там.
Дело в том, что 99% использует для decltype
находится в шаблонах. Там нет эквивалентной функциональности для этого там. В не шаблонном коде auto
обычно то, что вы хотите использовать.
Хотя полезно получить переменные, объявленные с помощью auto
, если вам действительно нужно знать тип выражения, например, при создании возвращаемого типа для шаблонизированной функции, auto
недостаточно: вам нужно не просто назвать значение, но вам нужно овладеть типом, например, чтобы изменить его. Если бы что-нибудь можно было уронить, это было бы auto
, Тем не менее, использование decltype()
имеет тенденцию быть намного более многословным, т.е. auto
хороший короткий путь
auto
является выводом типа из инициализатора.
Пример:
auto x = 7;
auto x = expression;
decltype[E]
является типом ("объявленный тип") имени или выражения E и может использоваться в объявлениях.
Пример:
template <class T, class U>
auto mult(T& t1, U& u1) -> decltype (t1 * u1)
{
return t1 * u1;
}
Даже второй случай auto можно заменить на decltype, но auto выглядит хорошо для этого.
decltype (j * i) m = j * i;
decltype в основном используется в шаблонном программировании.