Дополнительно
decltype против auto
Как я понимаю, и decltype
, и auto
будут пытаться определить тип чего-либо.
Если мы определим:
int foo () {
return 34;
}
Тогда оба объявления законны:
auto x = foo();
cout << x << endl;
decltype(foo()) y = 13;
cout << y << endl;
Подскажите, пожалуйста, в чем основное различие между decltype
и auto
?
43
3
decltype
выдает заявленный тип выражения, которое ему передается.auto
делает то же самое, что и вычитание типа шаблона. Так, например, если у вас есть функция, которая возвращает ссылку,auto
все еще будет значением (вам нужноauto&
, чтобы получить ссылку), ноdecltype
будет точно соответствовать типу возвращаемого значения.auto
(в контексте, где он определяет тип) ограничивается определением типа переменной, для которой есть инициализатор.decltype
- это более широкая конструкция, которая, за счет дополнительной информации, выводит тип выражения.В тех случаях, когда можно использовать
auto
, она более лаконична, чемdecltype
, так как вам не нужно предоставлять выражение, из которого будет выведен тип.Ключевое слово
auto
также используется в совершенно несвязанном контексте, при использовании трейлинг возвращаемых типов для функций:Здесь
auto
является ведущим только для того, чтобы компилятор знал, что это объявление с трейлинговым типом возврата. Хотя приведенный выше пример можно тривиально преобразовать к старому стилю, в общем программировании он полезен:Обратите внимание, что в этом случае
auto
не может быть использовано для определения возвращаемого типа.Обычно, если вам нужен тип для переменной, которую вы собираетесь инициализировать, используйте auto. decltype лучше использовать, когда вам нужен тип для чего-то, что не является переменной, например, для возвращаемого типа.