Накрутка лямбда в std::bind для захвата R-значение

std::bind

У меня ситуация, когда я застряла с 11 только компилятор (GCC 4.7.2, поэтому у меня нет доступа к C 14 обобщенного лямбда-захват), поэтому я использую в работе-если мне нужно, чтобы захватить движение объекта.

this stackoverflow answer

Я читал про такое решение , и у меня было много успехов, используя эту технику.

Однако, у меня ситуация, когда я форма высшего порядка функтор, направив связывать выражение, связанное аргумент другого привязать выражение.

Я могу упростить это для примера. Пример надуманный и упрощенный для целей настоящего вопрос:

template <class F>void func(F&& func){    auto f = std::bind(        [](F& f) -> void        {        },        std::forward<F>(func)    );    f(); // causes compiler error}int main(){    func(        std::bind(            []() { }        )    );}
f()

По причине, которой я не понимаю, компилятор выдает кучу ошибок, когда я звоню . А не вставлять все сообщение об ошибке, я постараюсь упростить это:

test7.cpp:22:2: error: no match for call to ‘(std::_Bind<func(F&&) [with F = std::_Bind<main()::<lambda()>()>]::<lambda(std::_Bind<main()::<lambda()>()>)>(std::_Bind<main()::<lambda()>()>)>) ()’

Эта ошибка генерируется из 4.7.2 ССЗ.

main()bindbind

Я не вижу причин, почему это должно произойти. В надуманном примере выше, вы заметите, что у меня есть лишний выражения по пустому лямда. Если я удалить выражение, и просто передать пустую лямда, как:

func([]() { });
bind[](){}std::bind([](){})

... то ошибка не возникает. Но опять же, это надуманный пример, в реальном приложении, мне нужно, чтобы обернуть лямбда-выражения с целью захвата перемещения. И я не вижу причин, почему семантически отличается от . Они должны быть функционально эквивалентны, хотя они оценивают в разных видах.

Итак, почему эта ошибка происходит? Или это просто проблема с GCC? (Я понимаю, 4.7.2 немного старая на данный момент.)