Возвращаемый тип лямбда может быть выведено возвращаемым значением, поэтому почему функция не может быть функцией?
#include <iostream>
int main(){
auto lambda = [] {
return 7;
};
std::cout << lambda() << '\n';
}
Эта программа компилирует и печатает 7.
Тип возврата лямбда выводится на целочисленный тип на основе возвращаемого значения 7.
Почему это невозможно с обычными функциями?
#include <iostream>
auto function(){
return 42;
}
int main(){
std::cout << function() << '\n';
}
ошибка: функция function использует автоматический идентификатор типа без возвращаемого типа возврата
Ответы
Ответ 1
С++ 14 имеет эту функцию. Вы можете протестировать его с новыми версиями GCC или clang, установив флаг -std=c++1y
.
Пример в реальном времени
Кроме того, в С++ 14 вы также можете использовать decltype(auto)
(который отражает decltype(auto)
как переменный) для вашей функции, чтобы вывести его возвращаемое значение с помощью семантики decltype
.
Примером может быть то, что для функций пересылки, для которых decltype(auto)
особенно полезно:
template<typename function_type, typename... arg_types>
decltype(auto) do_nothing_but_forward(function_type func, arg_types&&... args) {
return func(std::forward<arg_types>(args)...);
}
С помощью decltype(auto)
вы подражаете фактическому типу возврата func
при вызове с указанными аргументами. Больше нет дублирования кода в возвратном типе возврата, который очень расстраивает и подвержен ошибкам в С++ 11.
Ответ 2
Это просто ограничение того, как язык был создан и развился. В следующем стандарте С++ 14 возвращаемый тип функции может быть выведен в некоторых контекстах, хотя и не во всех. Есть сложности, когда есть несколько операторов возврата.
Кроме того, выведенные типы возвращаемых типов имеют другие проблемы, например, тип возврата функции шаблона не может использоваться в контексте SFINAE, чтобы иметь возможность выводить тип, компилятор должен создать экземпляр шаблона функции, который происходит после замены. Конечным результатом является то, что пока функция появится в ближайшем будущем, я бы избегал ее, если вы можете предоставить тип самостоятельно.
Ответ 3
Это происходит в С++ 14. См. Следующее .
Ответ 4
Его еще нет. Его можно будет найти на С++ 1y/С++ 14.. ознакомьтесь с этой ссылкой
Ответ 5
Я предполагаю, что это возможно потому, что тип-выводные лямбда не могут быть рекурсивными.
Почему это имеет значение? Потому что, если тип-выводная лямбда может быть рекурсивной (под термином "тип-вывод" я имею в виду, где имя переменной имеет тип auto
), то его тип возврата потенциально может зависеть от самого себя - и хотя это иногда можно решить, это гораздо сложнее реализовать, чем "простой" вывод типа. Я даже не уверен, всегда ли он разрешима (разрешима ли она в общем случае?). Если функции поддерживают вывод типа, однако, эту проблему нужно будет позаботиться, поэтому, вероятно, они просто исключили их по этой причине.