Возвращаемый тип лямбда может быть выведено возвращаемым значением, поэтому почему функция не может быть функцией?

#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), то его тип возврата потенциально может зависеть от самого себя - и хотя это иногда можно решить, это гораздо сложнее реализовать, чем "простой" вывод типа. Я даже не уверен, всегда ли он разрешима (разрешима ли она в общем случае?). Если функции поддерживают вывод типа, однако, эту проблему нужно будет позаботиться, поэтому, вероятно, они просто исключили их по этой причине.