假设我有以下代码段:
// 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&'
我的问题:
答案 0 :(得分:7)
MSVC偏离标准,因为它允许匿名临时值绑定到非常量左值引用。您可以使用/Za
编译器标志(“禁用语言扩展”)或MSVC2017中更清晰的/permissive-
选项来关闭此功能。
C ++标准一直很清楚,匿名临时版只能绑定到const
引用。