Вложение лямбда-выражения с передачей параметра по ссылке в c ++ - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь использовать лямбда-выражения в 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

1 Ответ

3 голосов
/ 09 марта 2020

Код пытается привязать ссылку lvalue (1-й аргумент внешнего f1) к prvalue (возвращаемое значение внутреннего f1), это недопустимо.

Вы можете это исправить передавая константную ссылку, std::unique_ptr<float[]> const &input_data.

Я бы посчитал, что параметр должен быть float const *, поскольку работа функции не зависит от того, как управление памятью работает для входного массива. На самом деле std::span было бы уместно и здесь.

...