Подтвердить что ты не робот

В чем смысл auto main() → int?

Мне довелось встретить приведенный ниже фрагмент кода в видео на С++ 11, где автор использует

auto main()->int

Я не понял этого. Я попытался скомпилировать g++ с помощью -std=c++11, и он работает. Может ли кто-нибудь объяснить мне, что здесь происходит? Я попытался выполнить поиск с использованием "auto main() → int", но не нашел никакой помощи.

4b9b3361

Ответ 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 без конечного типа возврата.