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_lists, які не виводиться в контексті шаблону), потімautoвведіть вирахування.