Инструкция decltype

При использовании ключевого слова auto учитывается только тип. Объявления const (константа) и ссылки отбрасываются:

const int x = 10;
auto y = x;                        // Тип int, а не const int
// ++x; // error: increment of read-only variable 'x'
++y;    // OK
std::cout << y << std::endl;       // 11

Если нужно сохранить объявление const, то следует воспользоваться инструкцией decltype, после которой внутри круглых скобок указать переменную или выражение, на основе которых будет определяться тип переменной. Чтобы тип определялся по выражению инициализации, внутри круглых скобок указываем ключевое слово auto:

const int x = 10;
decltype(auto) y = x;              // Тип const int
// ++x; // error: increment of read-only variable 'x'
// ++y; // error: increment of read-only variable 'y'
std::cout << y << std::endl;       // 10
decltype(x) z = 20;                // Тип const int
// ++z; // error: increment of read-only variable 'z'
std::cout << z << std::endl;       // 20
decltype(10L) k = 15;              // Тип long int
std::cout << k << std::endl;       // 15

Если переменную или выражение внутри круглых скобок дополнительно заключить в круглые скобки, то тип будет ссылочным:

int x = 10;
decltype(x) y = x;                 // Тип int
++y;
std::cout << x << std::endl;       // 10
std::cout << y << std::endl;       // 11
x = 20;
decltype((x)) z = x;               // Тип int&
++z;
std::cout << x << std::endl;       // 21
std::cout << z << std::endl;       // 21

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов