【发布时间】: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<float [],std::default_delete<float []>> main::<lambda_1>::operator ()(std::unique_ptr<float [],std::default_delete<float []>> &,int) const': cannot convert argument 1 from 'std::unique_ptr<float [],std::default_delete<float []>>' to 'std::unique_ptr<float [],std::default_delete<float []>> &' 错误消息。
上面的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