exponenta event banner

Правило AUTOSAR C++ 14 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 Библиотека языковой поддержки
Категория: Обязательно, Автоматизировано
Представлен в R2019b