Я пытаюсь использовать лямбда-выражения в C ++. Пример лямбда-выражения показан ниже. Входным параметром функции 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 []>> &'
message.
Выше result
должно быть то же, что и ниже.
auto result1 = f1(test_object, size_for_testing);
auto result = f1(result1, size_for_testing);
Мне интересно, что 1) Неуместно ли писать лямбда-выражение с передачей параметров по ссылке? 2) Почему использование функции f1 без вложений нормально, но при использовании вложений появляется ошибка C2664?
ОС: Windows 10 1909
IDE: версия Microsoft Visual Studio Community 2019 16.4.5