Давайте возьмем вот такой код для старта.
int main() {
const int x = 42;
auto a = x;
auto& b = x;
}Давайте попробуем угадать, какого типа будут переменные a и b?
decltype(a)
decltype(b)
Это прекрасное:
static_assert(std::is_same_v<decltype(a), int>);
static_assert(std::is_same_v<decltype(b), const int&>);
Тоесть при копии у нас теряется константность. А при получении ссылки не теряется.
И если разобраться.... Это абсолютно логично!!!
Но блин, когда ты только только глядишь - это сначала выбивает тебя немного в ступор.
А что делать, если мы хотим что-то менее логичное, но более интуитивное?
А что-то такое:
#include <iostream>
#include <type_traits>
int main() {
const int x = 42;
decltype(auto) a = x;
auto& b = x;
// ...
}