общие лямбды mem_fn с gcc - PullRequest
       3

общие лямбды mem_fn с gcc

0 голосов
/ 08 декабря 2018

Я пытаюсь преобразовать лямбды в mem_fn в C ++.

Я столкнулся с проблемой с gcc и универсальными лямбдами.Кто-нибудь знает, можно ли что-то сделать для gcc?

#include <functional>

// Standard lambda
auto std_lambda = [](double x) -> double { 
    return 2. * x; 
};


// generic lambda
auto generic_lambda = [](auto x) { 
    auto two = static_cast<decltype(x)>(2.l);
    return two * x; 
};



void test()
{
    // convert lambdas to mem_fn
    // this call works on gcc/clang/msvc
    auto std_mem_fn = std::mem_fn( 
        & decltype(std_lambda)::operator() );

    // convert lambdas to mem_fn
    // this call works on clang/msvc
    // but fails on gcc
    auto generic_mem_fn = std::mem_fn( 
        & decltype(generic_lambda)::template operator()<double> );

    // By the way, I would be interested to make the 
    // mem_fn instantiation code more similar 
    // for generic and template lambdas
}

Проверьте этот код на Compiler Explorer (работает на clang, mscv, но не на gcc)

1 Ответ

0 голосов
/ 08 декабря 2018

Это может быть ошибка GCC, так как она компилируется, если вы «используете» общую лямбду перед сборкой std::mem_fun.Под «использованием» я подразумеваю, например, вызов лямбды или сохранение указателя mem-fun отдельно:

#include <functional>

auto generic_lambda = [](auto x) { 
    auto two = static_cast<decltype(x)>(2.l);
    return two * x; 
};

int main()
{
    // call the lambda ...
    generic_lambda(1.0);

    // or retrieve the mem-fun ptr
    auto unused = &decltype(generic_lambda)::template operator()<double>;    

    // now it compiles on GCC
    auto generic_mem_fn = std::mem_fn( 
        & decltype(generic_lambda)::template operator()<double> );
}

см. живой пример

, чтобы вы могли использовать следующий подходчтобы сделать его совместимым с GCC:

auto ptr = &decltype(generic_lambda)::template operator()<double>;    
auto generic_mem_fn = std::mem_fn(ptr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...