В чем смысл auto main() → int?
Мне довелось встретить приведенный ниже фрагмент кода в видео на С++ 11, где автор использует
auto main()->int
Я не понял этого. Я попытался скомпилировать g++
с помощью -std=c++11
, и он работает.
Может ли кто-нибудь объяснить мне, что здесь происходит? Я попытался выполнить поиск с использованием "auto main() → int", но не нашел никакой помощи.
Ответы
Ответ 1
В С++ 11 введено обозначение для возвращающих возвращаемых типов: если объявление функции вводится с auto
, тип возвращаемого значения будет указан после параметров и последовательности ->
. То есть все, что делает, это объявить main()
для возврата int
.
Значение возвращаемых возвращаемых типов в основном относится к шаблону функции, где теперь можно использовать параметры для функции вместе с decltype()
для определения типа возврата. Например:
template <typename M, typename N>
auto multiply(M const& m, N const& n) -> decltype(m * n);
Объявляет функцию multiply()
возвращать тип, созданный m * n
. Использование decltype()
перед multiply()
было бы неверным, поскольку m
и n
пока не объявлены.
Хотя он в основном полезен для шаблона функции, для других функций можно использовать одну и ту же нотацию. С С++ 14 возвращаемый тип возврата может даже быть опущен, когда функция вводится с auto
в некоторых условиях.
Ответ 2
Это синтаксис объявления единой формы, тип возвращаемого возврата, введенный в С++ 11.
Вы не можете использовать какой-либо другой синтаксис для lamdas, а также очень удобно для шаблонов функций, где тип результата зависит от аргументов.
Если вы хотите выбрать один синтаксис (и я думаю, что это хорошая идея), тогда у вас нет выбора: старый синтаксис не может использоваться для лямбда.
Причина для этого:
-
Ну, один синтаксис.
-
Имя функции всегда в одном месте визуально, поддерживает быструю сканирование кода.
-
То же самое для типа результата, легкого визуального распознавания (плюс, вам не нужно его квалифицировать, когда это тип, определенный в классе функций-члена).
Причины против включают некоторые добавленные многословности, использование старых компиляторов, которые не понимают этот синтаксис, что все новое может чувствовать себя страшно и неудобно и просто странно.
Ответ 3
Он называется trailing-return-type. Это особенно полезно в общих кодах с использованием шаблонов, где тип возврата зависит от выражения, содержащего некоторые другие аргументы шаблона. Он также используется в лямбда.
Вот пример:
template<typename T, typename U>
auto add(T t, U u) -> decltype(t+u)
{
return t + u;
}
Здесь тип возврата зависит от выражения t+u
. Таким образом, независимо от типа выражения, это также возвращаемый тип функции, обозначенный decltype(t+u)
.
Ответ 4
В С++ 14 конечный тип возврата может быть даже опущен, когда функция вводится с auto при некоторых условиях.-> Какие условия можно использовать для использования auto без конечного типа возврата.