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

时间:2018-04-23 12:47:39

标签: c++ gcc visual-studio-2012 lambda

假设我有以下代码段:

// 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&'

我的问题:

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

1 个答案:

答案 0 :(得分:7)

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

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