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&'
我的问题:
- 所以,根据错误,我假设 lambda 是一个临时变量,因此不能通过引用传递 - 对吗?
- 另外 - 知道为什么这适用于 MSVC 吗? - 它会自动修复我写的内容吗?
MSVC 偏离标准,因为它允许将匿名临时对象绑定到非常量左值引用。您可以使用 /Za
编译器标志 ("disable language extensions") 或 MSVC2017 中更清晰的 /permissive-
选项关闭此功能。
C++ 标准一直明确匿名临时对象只能绑定到 const
引用。
假设我有以下代码片段:
// 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 吗? - 它会自动修复我写的内容吗?
MSVC 偏离标准,因为它允许将匿名临时对象绑定到非常量左值引用。您可以使用 /Za
编译器标志 ("disable language extensions") 或 MSVC2017 中更清晰的 /permissive-
选项关闭此功能。
C++ 标准一直明确匿名临时对象只能绑定到 const
引用。