Я редко вижу decltype(auto)
но когда я это делаю, это смущает меня, потому что, кажется, делает то же самое, что и auto
при возвращении из функции.
auto g() { return expr; }
decltype(auto) g() { return expr; }
В чем разница между этими двумя синтаксисами?
auto
следует правилам вывода аргументов шаблона и всегда является типом объекта; decltype(auto)
следует за decltype
правила определения ссылочных типов на основе категорий значений. Так что если у нас есть
int x;
int && f();
затем
expression auto decltype(auto)
----------------------------------------
10 int int
x int int
(x) int int &
f() int int &&
auto
возвращает тип значения, который будет выведен из return
пункт к auto
переменная. decltype(auto)
возвращает тип, который вы получили бы, если бы вы завернули предложение return в decltype
,
auto
возвращает по значению, decltype
возможно, нет.