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

c++ can a temporary lambda be passed by reference (works on msvc/windows but not 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 上开发。这一切都编译得很好并且似乎有效。但是,当我在 Linux 平台上使用 gcc 编译器时,出现以下(缩写)错误:

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

我的问题:

MSVC 偏离标准,因为它允许将匿名临时对象绑定到非常量左值引用。您可以使用 /Za 编译器标志 ("disable language extensions") 或 MSVC2017 中更清晰的 /permissive- 选项关闭此功能。

C++ 标准一直明确匿名临时对象只能绑定到 const 引用。