Зачем нужен данный синтаксис, ведь тип результата не вычисляется автоматом?
auto foo(int arg) -> int {}
Ответ
Этот синтаксис появился в результате включения в стандарт C++ лямбда-выражений.
Лямбда-выражение может быть записано, например, как,
auto foo = [](int arg) -> int { /*...*/ };
Это лямбда-выражение может быть преобразовано в функцию, имеющую тип int( int )
Этот синтаксис переняли для объявления функций. У функции в ее начале должен присутствовать спецификатор(ы) типа возвращаемого выражения. Так как реальный тип возвращаемого значения указывается после списка параметров, то в качестве спецификатора возвращаемого значения в объявлении функции используется спецификатор auto
В приведенном вами примере большого смысла так объявлять функцию не имеется. Но иногда тип возвращаемого значения может зависеть от типа вычисления сложного выражения, определить который программисту самостоятельно бывает трудно, да и это может привести к ошибке.
Поэтому этот синтаксис удобен, например, при объявлении шаблонных функций.
Рассмотрите следующую демонстрационную программу.
#include
template
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 в данном примере облегчает объявление функции.
Комментариев нет:
Отправить комментарий