Страницы

Поиск по вопросам

вторник, 9 октября 2018 г.

Непонятный синтаксис

Зачем нужен данный синтаксис, ведь тип результата не вычисляется автоматом?
auto foo(int arg) -> int {}


Ответ

Этот синтаксис появился в результате включения в стандарт C++ лямбда-выражений.
Лямбда-выражение может быть записано, например, как,
auto foo = [](int arg) -> int { /*...*/ };
Это лямбда-выражение может быть преобразовано в функцию, имеющую тип int( int )
Этот синтаксис переняли для объявления функций. У функции в ее начале должен присутствовать спецификатор(ы) типа возвращаемого выражения. Так как реальный тип возвращаемого значения указывается после списка параметров, то в качестве спецификатора возвращаемого значения в объявлении функции используется спецификатор auto
В приведенном вами примере большого смысла так объявлять функцию не имеется. Но иногда тип возвращаемого значения может зависеть от типа вычисления сложного выражения, определить который программисту самостоятельно бывает трудно, да и это может привести к ошибке.
Поэтому этот синтаксис удобен, например, при объявлении шаблонных функций.
Рассмотрите следующую демонстрационную программу.
#include
template auto foo(const T &x, const U &y) -> decltype( x + y ) { return x + y; }
int main() { int x = 10; int y = 20;
std::cout << typeid(foo(x, y)).name() << std::endl;
long z = 30;
std::cout << typeid(foo(x, z)).name() << std::endl;
float f = 40;
std::cout << typeid(foo(x, f)).name() << std::endl; }
Вывод программы на консоль, например, в MS VC++ может выглядеть как
int long float
Заранее сказать, какой будет тип возвращаемого выражения, невозможно. Он зависит от типов параметров функции и от типа вычисляемого выражения. Использование спецификатора типа auto в данном примере облегчает объявление функции.

Комментариев нет:

Отправить комментарий