【问题标题】:Nesting lambda expression with passing parameter by reference in c++在c ++中通过引用传递参数嵌套lambda表达式
【发布时间】:2020-03-09 07:57:54
【问题描述】:

我正在尝试在 C++ 中使用 lambda 表达式。下面演示了一个 lambda 表达式的示例。函数 f1 的输入参数是 std::unique_ptr,输出参数也是 std::unique_ptr。

    auto f1 = [](std::unique_ptr<float[]> &input_data, int size)->std::unique_ptr<float[]>
    {
        auto return_data = std::make_unique<float[]>(size);
        for (int loop_number = 0; loop_number < size; loop_number++)
        {
            return_data[loop_number] = input_data[loop_number] + 1;                  //  for example
        }
        return return_data;
    };

函数f1的非嵌套用法如下所示。运行成功。

    int size_for_testing = 100;
    auto test_object = std::make_unique<float[]>(size_for_testing);
    auto result = f1(test_object, size_for_testing);
    for (int loop_number = 0; loop_number < size_for_testing; loop_number++)
    {
        std::cout << result[loop_number] << std::endl;
    }

如下图的嵌套情况,出现错误。

auto result = f1(f1(test_object, size_for_testing), size_for_testing);

编译器显示 C2664 错误并带有 'std::unique_ptr&lt;float [],std::default_delete&lt;float []&gt;&gt; main::&lt;lambda_1&gt;::operator ()(std::unique_ptr&lt;float [],std::default_delete&lt;float []&gt;&gt; &amp;,int) const': cannot convert argument 1 from 'std::unique_ptr&lt;float [],std::default_delete&lt;float []&gt;&gt;' to 'std::unique_ptr&lt;float [],std::default_delete&lt;float []&gt;&gt; &amp;' 错误消息。

上面的result应该和下面一样。

    auto result1 = f1(test_object, size_for_testing);
    auto result = f1(result1, size_for_testing);

我想知道 1) 通过引用传递参数来编写 lambda 表达式是否不合适? 2) 为什么函数f1的非嵌套使用没问题,但是嵌套使用出现错误C2664?

操作系统:Windows 10 1909

IDE:Microsoft Visual Studio Community 2019 版本 16.4.5

【问题讨论】:

标签: c++ lambda pass-by-reference


【解决方案1】:

代码尝试将左值引用(外部f1 的第一个参数)绑定到纯右值(内部f1 的返回值),这是不允许的。

您可以通过传递 const 引用 std::unique_ptr&lt;float[]&gt; const &amp;input_data 来修复它。

我会考虑将参数设置为float const *,因为函数的操作不依赖于输入数组的内存管理工作方式。事实上std::span 在这里也很合适。

【讨论】:

  • 在嵌套时使用裸指针也会产生错误
  • @AlanBirtles:也适当更改用法:f1(f1(test_object.get(), size_for_testing).get(), size_for_testing)
  • 除了@M.M,数组没有被修改,所以他选择了float const *而不是float*
猜你喜欢
  • 2011-04-21
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 2017-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多