在 C++ 中通过引用传递参数嵌套 lambda 表达式
Nesting lambda expression with passing parameter by reference in c++
我正在尝试在 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错误?
OS: Windows 10 1909
IDE:Microsoft Visual Studio Community 2019 版本 16.4.5
代码试图将左值引用(外部 f1
的第一个参数)绑定到纯右值(return 内部 f1
的值),这是不允许的。
您可以通过传递 const 引用来修复它,std::unique_ptr<float[]> const &input_data
.
我会考虑将参数设置为 float const *
,因为该函数的操作不依赖于输入数组的内存管理方式。事实上 std::span
在这里也很合适。
我正在尝试在 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错误?
OS: Windows 10 1909
IDE:Microsoft Visual Studio Community 2019 版本 16.4.5
代码试图将左值引用(外部 f1
的第一个参数)绑定到纯右值(return 内部 f1
的值),这是不允许的。
您可以通过传递 const 引用来修复它,std::unique_ptr<float[]> const &input_data
.
我会考虑将参数设置为 float const *
,因为该函数的操作不依赖于输入数组的内存管理方式。事实上 std::span
在这里也很合适。