Подтвердить что ты не робот

С++ 11 lambda в decltype

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

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'

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

4b9b3361

Ответ 1

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

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

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

auto F = [](int count) { return [](int m) { return 0; }; };

Ответ 2

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

#include <functional>

std::function<int(int)> F(int count)
{                                                               
    return [](int m) { return 0; };                                  
}

Ответ 3

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

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