【问题标题】:c++ can a temporary lambda be passed by reference (works on msvc/windows but not gcc/linux)?c++ 可以通过引用传递临时 lambda(适用于 msvc/windows 但不适用于 gcc/linux)?
【发布时间】:2018-04-23 12:47:38
【问题描述】:

假设我有以下代码 sn-ps:

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

我的问题:

  • 所以,根据错误,我假设 lambda 是一个临时变量,因此不能通过引用传递 - 对吗?
  • 另外 - 知道为什么这适用于 MSVC 吗? - 它会自动修复我写的内容吗?

【问题讨论】:

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


    【解决方案1】:

    MSVC 与标准的不同之处在于它允许匿名临时对象绑定到非 const 左值引用。您可以使用 /Za 编译器标志(“禁用语言扩展”)或 MSVC2017 中更清晰的 /permissive- 选项将其关闭。

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

    【讨论】:

    • 啊,很酷 - 所以我通过删除“by-ref”(即通过复制)“修复”了我的代码,所以理论上我仍然可以通过 ref 只要它的void start_work(const Functor &amp;worker_fn) - 是那个正确的签名?
    • @code_fodder;是的,使用 const 引用作为函数参数将修复 gcc 构建。
    • 做了一个小小的迂腐修正。希望你不介意
    • 不,它将在函数调用期间保留在范围内。
    • @code_fodder:“即使有线程”。如果您在 lambda 捕获中使用引用,则需要确保原始对象在范围内,此时 lambda 运行。
    猜你喜欢
    • 2022-11-26
    • 2021-08-07
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多