2015-03-19 2 views
9

Я играю с лямбда-выражениями, и я использую auto в качестве входного параметра.возвращаемые значения из lambdas с автоматическим параметром

я попробовать этот код ниже

auto f2 = [](auto a){ return a;}; 
std::cout << f2(10) << std::endl; 
std::cout << f2("hi there!") << std::endl; 

С моим большим удивлением он компилирует и запустить нормально! Как это возможно?

Если я не ошибаюсь (это поставляется с C++ 14), то объект-объект operator() является шаблоном, поскольку в качестве входного параметра он использует auto.

Как он управляет несколькими типами возврата? Первая строка возвращает int, а вторая строка возвращает const char*.

Является ли компилятор, создающий несколько operator() за кулисами?

+0

Как бы вы написали эту лямбду как шаблон функции? – chris

+0

Я не думаю, что стандарт предусматривает, как объекты функции должны быть реализованы. То есть, они не ограничиваются основанием для шаблонов или функторов старого стиля. –

+1

_I компилятор создает несколько 'operator()' за кулисами? _ Да, шаблон функции создает другую функцию каждый раз, когда она создается с помощью другого аргумента шаблона. Лямбда не делает ничего особенного. – Oktalist

ответ

9

Как вы говорите, operator() общей лямбда эффективно является шаблоном функции. Нечто похожее на:

struct noname 
{ 
    template<typename T> 
    auto operator()(T a) const { return a; } 
}; 

Ваши отдельные вызовы создают две различные функции.

auto operator()(int a) const { return a; } 
auto operator()(const char* a) const { return a; } 

Оттуда правила auto типа возвращаемого значения применяются. В первой функции первый и единственный оператор возврата возвращает int, поэтому int выводится как возвращаемый тип. То же самое для const char*

Смежные вопросы