auto
використовує той самий механізм відрахування типу, що і шаблони, єдиним винятком, про який я знаю, що це списки списків-фігурних дужок, які виведені auto
якstd::initializer_list
, але не виводяться в контексті шаблону.
auto x = expression;
працює, спочатку видаляючи всі посилальні та cv-кваліфікатори з типу виразу з правої сторони, а потім узгоджуючи тип. Наприклад, якщо у вас є, const int& f(){...}
то auto x = f();
виводить x
як int
, а ні const int&
.
Інша форма,
auto& x = expression
не знімає cv-кваліфікатори, тому, використовуючи приклад вище, auto& x = f()
виводить x
як const int&
. Інші комбінації просто додають кваліфікаційні критерії.
Якщо ви хочете, щоб ваш тип завжди виводився за допомогою кваліфікаторів cv-ref, використовуйте скандально відомий decltype(auto)
в C ++ 14, який використовує decltype
правила вирахування типу.
Отже, якщо коротко, якщо ви хочете копії, використовуйте auto
, якщо хочете посилання, використовуйте auto&
. Використовуйте const
щоразу, коли ви хочете отримати додаткові можливості const
.
EDIT
Існує додатковий варіант використання,
auto&& x = expression;
який використовує правила згортання посилань, так само, як у випадку пересилання посилань у коді шаблону. Якщо expression
це значення lvalue, тоді x
це посилання на значення lvalue з CV-кваліфікаторами expression
. Якщо expression
це значення rvalue, тоді x
це посилання на значення rvalue.
auto
працює (за винятком особливого випадкуinitializer_list
s, які не виводиться в контексті шаблону), потімauto
введіть вирахування.