C++ может ли временная лямбда передаваться по ссылке (работает на msvc/windows, но не на gcc/linux)?

Допустим, у меня есть следующие фрагменты кода:

// global variable
std::thread worker_thread;

// Template function
template <typename Functor>
void start_work(Functor &worker_fn)  // lambda passed by ref
{
    worker_thread = std::thread([&](){
        worker_fn();
    });
}

Это называется так:

void do_work(int value)
{
    printf("Hello from worker\r\n");
}

int main()
{
    // This lambda is a temporary variable...
    start_work([do_work](int value){ do_work(value) });
}

Я начал разрабатывать на MSVC2012. Все это хорошо скомпилировано и, похоже, работает. Однако когда я перешел на компилятор gcc на платформе Linux, я получил следующую (сокращенную) ошибку:

no known conversion for argument 1 '...__lambda3' to '...__lambda3&'

Мои вопросы:

  • Итак, из-за ошибки я предполагаю, что лямбда была временной переменной и поэтому не может быть передана по ссылке - это правильно?
  • Кроме того - любая идея, почему это будет работать с MSVC? - это авто-исправление того, что я написал?

1 ответ

Решение

MSVC отличается от стандарта тем, что позволяет анонимным временным привязкам связываться с неконстантными ссылками lvalue. Вы можете отключить это с помощью /Za флаг компилятора ("отключить языковые расширения") или более острый /permissive- вариант от MSVC2017.

В стандарте C++ всегда было ясно, что анонимные временные пользователи могут связываться только с const Рекомендации.

Другие вопросы по тегам