メインコンテンツ

AUTOSAR C++14 Rule A18-9-1

The std::bind shall not be used

説明

ルール定義

std::bind を使用してはなりません。

根拠

std::bind は、関数オブジェクトなどの呼び出し可能なオブジェクトを受け取り、そのオブジェクトの転送呼び出しラッパーを生成します。そのラッパーを呼び出すことで、ラッパー内で指定した引数にバインドされた何らかのオブジェクト引数を使用して、そのオブジェクトが呼び出されます。たとえば、このコード スニペットでは bar によって foo が呼び出されます。このとき bar の 1 番目 (2 番目) の引数は foo の 2 番目 (1 番目) の引数にバインドされています。

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 を使用して作成する関数をコンパイラがインライン化することはあまりありません。

トラブルシューティング

ルール違反が想定されるものの、Polyspace® から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

#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);
}

この例では、bind_fn によって func が呼び出されます。この bind_fn では、func の 1 番目の引数にバインドされた引数のみを渡しています。開発者にとっては、bind_fn の定義内にある arg2func の 2 番目の引数となることが不明瞭です。コードの可読性を向上させるには、代わりにラムダ式を使用します。2 つの引数を使用して func を呼び出すことで、lambda_fn の定義がよりわかりやすくなります。

チェック情報

グループ: 18 言語サポート ライブラリ
カテゴリ: Required、Automated

バージョン履歴

R2019b で導入