Почему 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 в основном используется в шаблонном программировании.

Другие вопросы по тегам