Свойство ref и cv-десорбции `auto`.

Я узнал, что объявление переменной с использованием auto таким образом

auto var = expr;

в основном походит на выбор типа expr и снятие && & -references и всех констант верхнего уровня и летучести от него. Означает ли это, что указанная выше строка в точности эквивалентна следующему?

std::remove_cv<std::remove_ref<decltype(expr)>::type>::type var = expr;

Ответ 1

Нет, это не так. auto var = expr; больше похож на передачу expr по значению.

int x[1];
auto y = x;

Это делает y a int*.

В основном auto x = expr; ведет себя как вывод типа шаблона:

template <typename T>
void f(T);
int x[1];
f(x); // deduces T as int*

Это больше похоже на std::decay<decltype(expr)> var = expr;.