c ++可以通过引用传递临时lambda(适用于msvc/windows但不适用于gcc/linux)?

cod*_*der 5 c++ lambda gcc visual-studio-2012

可以说我有以下代码片段:

// 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();
    });
}
Run Code Online (Sandbox Code Playgroud)

这被称为:

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) });
}
Run Code Online (Sandbox Code Playgroud)

我开始在MSVC2012上开发.这一切都很好,似乎工作.但是当我在Linux平台上移动到gcc编译器时,我得到以下(缩写)错误:

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

我的问题:

  • 因此,从错误中我假设lambda是一个临时变量因此无法通过引用传递 - 是吗?
  • 另外 - 任何想法为什么这适用于MSVC? - 它是自动修复我写的吗?

Bat*_*eba 7

MSVC偏离标准,因为它允许匿名临时值绑定到非常量左值引用.您可以使用/Za编译器标志("禁用语言扩展")或/permissive-MSVC2017 的更清晰选项来关闭它.

C++标准一直很清楚,匿名临时工具只能绑定到const引用.