AUTOSAR C++ 14 Rule A18-9-1

std:: bind не должен использоваться

Описание

Определение правила

std:: bind не используется.

Объяснение

std::bind принимает вызываемый объект, такой как объект функции, и создает оболочку переадресационного вызова для этого объекта. Вызов оболочки вызывает объект с некоторыми аргументами объекта, связанными с аргументами, заданными в оболочке. Например, в этом фрагменте кода, foo вызывается через bar с первым (вторым) аргументом bar привязка ко второму (первому) аргументу foo.

int foo(int, int);
auto bar = std::bind(foo, _2, _1);
bar(10, 20); //call to foo(20, 10)

Использование std::bind приводит к менее читаемому вызову функции. Разработчик, который не знаком с foo нужно будет увидеть декларацию foo чтобы понять, как передать аргументы в bar, и может спутать один параметр функции с другим. В сложение компилятор реже вводит функцию, которую вы создаете используя std::bind.

Поиск и устранение проблем

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

#include <cstdint>polys
#include <functional>
class A
{
//...
};
void func(A const& a, double y) noexcept
{
//...
}
void func1() noexcept
{
    double arg2 = 0.0;
    auto bind_fn = std::bind(&func, std::placeholders::_1, arg2); // Non-compliant
    // ...
    A const a{};
    bind_fn(a);
}
void func2() noexcept
{
    auto lambda_fn = [](A const & a) -> void { // Compliant
        double arg2 = 0.0;
        func(a, arg2);
    }; // Compliant
    // ...
    A const a{};
    lambda_fn(a);
}

В этом примере func вызывается через bind_fn с единственным аргументом bind_fn связан с первым аргументом func. Разработчику может быть неясно, что arg2 в определении bind_fn является вторым аргументом func. Для более читаемого кода используйте вместо этого лямбда-выражения. Вызов func с двумя аргументами яснее в определении lambda_fn.

Проверяйте информацию

Группа: 18 Language Support Library
Категория: Необходимый, Автоматизированный
Введенный в R2019b