Mediumautodecltype

В чём разница между auto, decltype и decltype(auto)?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

auto выводит по правилам шаблона (отбрасывает ссылку и top-level const). decltype(expr) даёт тип ровно как объявлено, включая ссылочность. decltype(auto) комбинирует: выводит через decltype от инициализатора.

int x = 5;
int& r = x;
auto a = r;            // int
decltype(r) d = r;     // int&
decltype(auto) da = r; // int&

// Для perfect forwarding возвращаемого значения:
template<typename T>
decltype(auto) f(T&& x) { return g(std::forward<T>(x)); }

Правило decltype: T если expr — prvalue, T&& если xvalue, T& если lvalue. decltype(name) (идентификатор) даёт тип объявления; decltype((name)) (в скобках) — всегда ссылка.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.