Тип скользящего возвращаемого значения
В компьютерном программировании подпрограмма ) (она же функция часто информирует вызывающий код о результате своего вычисления, возвращая значение этому вызывающему коду. Тип данных значения функции этого значения называется типом возвращаемого .
В языке программирования C++ функция должна быть объявлена. Тип возвращаемого значения функции C++ указывается как часть объявления этой функции. [ 1 ] Завершающий тип возвращаемого значения — функция синтаксиса, доступная начиная с C++11 , — похож на традиционный тип возвращаемого значения, за исключением того, что он указан в другом месте. [ 2 ] [ 3 ] [ 4 ]
Синтаксис
[ редактировать ]Перед именем функции указывается обычный тип возвращаемого значения.
В этом примере традиционного кода C++ тип возвращаемого значения HasMultipleItems()
является bool
:
class CClass {
public:
bool HasMultipleItems();
std::vector<int> m_veciMember;
};
bool CClass::HasMultipleItems() {
return m_veciMember.size() > 1;
}
Завершающий тип возвращаемого значения указывается после списка параметров, после ->
символы:
class CClass {
public:
auto HasMultipleItems() -> bool;
std::vector<int> m_veciMember;
};
auto CClass::HasMultipleItems() -> bool {
return m_veciMember.size() > 1;
}
Отличие от других особенностей языка
[ редактировать ]В современном C++ значение auto
ключевое слово будет зависеть от его контекста:
- При использовании в определении переменной ( например ,
auto x = 11;
),auto
Ключевое слово указывает на вывод типа . Тип данных для этогоx
будет выведено из его инициализации. Тип возвращаемого значения функции также можно определить с помощьюauto
без указания конечного типа возвращаемого значения (например,)auto CClass::HasMultipleItems() { return m_veciMember.size() > 1; }
- С другой стороны, в
HasMultipleItems()
пример из предыдущего раздела. В этом примере используется толькоauto
ключевое слово как синтаксический элемент, поскольку используется завершающий тип возвращаемого значения.
Обоснование
[ редактировать ]Рассмотрим задачу программирования обобщенной версии int Add(const int& lhs, const int& rhs) { return lhs + rhs; }
.
Правильное выражение типа возвращаемого значения этой функции будет использовать два формальных имени параметра с decltype : decltype(lhs + rhs)
.
Но там, где тип возвращаемого значения традиционно указывается, эти два формальных параметра еще не входят в область действия.
Следовательно, этот код не будет компилироваться:
// This will not compile
template<typename TL, typename TR>
decltype(lhs + rhs) Add(const TL& lhs, const TR& rhs) {
return lhs + rhs;
}
Формальные параметры находятся в области видимости, где указан завершающий тип возвращаемого значения:
template<typename TL, typename TR>
auto Add(const TL& lhs, const TR& rhs) -> decltype(lhs + rhs) {
return lhs + rhs;
}
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Страуструп, Бьярне (2013). Язык программирования C ++ (Четвертое изд.). Аддисон-Уэсли. ISBN 978-0-321-56384-2 .
- ^ «Объявление функции» . cppreference.com . Справочник по С++ . Проверено 1 марта 2021 г.
- ^ «Типы возврата суффикса C++0x» . cplusplus.com . Сеть ресурсов C++ . Проверено 1 марта 2021 г.
- ^ «Функции (C++)» . Microsoft C++, C и Ассемблер . Корпорация Майкрософт . Проверено 1 марта 2021 г.