C ++ 11 лямбда в decltype - PullRequest
       43

C ++ 11 лямбда в decltype

30 голосов
/ 31 января 2011

Для следующего кода:

auto F(int count) -> decltype([](int m) { return 0; }) 
{                                                               
    return [](int m) { return 0; };                                  
}

g ++ 4.5 выдает ошибки:

test1.cpp:1:32: error: expected primary-expression before 'int'
test1.cpp:1:32: error: expected ')' before 'int'

В чем проблема?Как правильно вернуть лямбду из функции?

Ответы [ 3 ]

44 голосов
/ 31 января 2011

Вы не можете использовать лямбда-выражение, кроме как путем фактического создания этого объекта, что делает невозможным переход к выводу типа, подобному decltype.

По иронии судьбы, правила лямбда-возврата делают так, что вы МОЖЕТЕ возвращать лямбда-выражения из лямбда-выражений, поскольку в некоторых ситуациях тип возвращаемого значения указывать необязательно.

У вас есть только два варианта - вернуть полиморфный контейнер, такой как std::function, или сделать само F настоящей лямбдой.

auto F = [](int count) { return [](int m) { return 0; }; };
9 голосов
/ 31 января 2011

что-то вроде этого соответствует вашим потребностям?

#include <functional>

std::function<int(int)> F(int count)
{                                                               
    return [](int m) { return 0; };                                  
}
4 голосов
/ 15 сентября 2017

С C ++ 14 это теперь возможно:

auto F(int count)
{
    return [](int m) { return 0; };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...