В C ++ 11 есть два синтаксиса для объявления функции:
декларации аргументов идентификатора возвращаемого типа (
... )
и
auto
идентификатор (
аргумент-объявления ... )
->
return_type
Они эквивалентны. Теперь, когда они эквивалентны, почему вы вообще хотите использовать последнее? Что ж, C ++ 11 представил эту замечательную decltype
вещь, которая позволяет вам описывать тип выражения. Таким образом, вы можете захотеть получить тип возвращаемого значения из типов аргументов. Итак, вы пытаетесь:
template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);
и компилятор скажет вам, что он не знает, что a
и b
находится вdecltype
аргументе. Это потому, что они объявляются только списком аргументов.
Вы можете легко обойти проблему, используя declval
и уже объявленные параметры шаблона. Подобно:
template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);
за исключением того, что теперь он становится действительно многословным. Таким образом, был предложен и реализован альтернативный синтаксис объявления, и теперь вы можете написать
template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);
и он менее подробный, и правила определения объема не нужно менять.
Обновление C ++ 14: C ++ 14 также позволяет
auto
идентификатор (
аргумент-объявления ... )
пока функция полностью определена перед использованием и все return
операторы относятся к одному и тому же типу. ->
Синтаксис остается полезным для общественных функций (объявленных в заголовке) , если вы хотите , чтобы скрыть тело в исходном файле. В некоторой степени очевидно, что это невозможно сделать с помощью шаблонов, но есть некоторые конкретные типы (обычно получаемые с помощью метапрограммирования шаблонов), которые трудно написать иначе.