В 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операторы относятся к одному и тому же типу. ->Синтаксис остается полезным для общественных функций (объявленных в заголовке) , если вы хотите , чтобы скрыть тело в исходном файле. В некоторой степени очевидно, что это невозможно сделать с помощью шаблонов, но есть некоторые конкретные типы (обычно получаемые с помощью метапрограммирования шаблонов), которые трудно написать иначе.