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
Рекомендации.