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