メインコンテンツ

AUTOSAR C++14 Rule A18-1-2

The std::vector<bool> specialization shall not be used

説明

ルール定義

特殊化 std::vector<bool> を使用してはなりません。

根拠

bool 型に対する std::vector の特殊化は、処理系定義の手法においては容量を効率的に使用することになるかもしれません。たとえば、std::vector<bool> は、必ずしも要素を連続する配列として格納するわけではありません。その特殊化が、すべての標準テンプレート ライブラリ (STL) アルゴリズムで期待どおりに動作することはありません (要素の連続シーケンスを返さないインデックス operator[]() など)。STL コンテナ std::vector<bool> の個々の要素を安全に変更することはできません。

トラブルシューティング

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

すべて展開する

#include <cstdint>
#include <vector>

class BoolWrapper
{
public:
    BoolWrapper() = default;
    constexpr BoolWrapper(bool b) : b_(b) {}
    constexpr operator bool() const
    {
        return b_;
    }
private:
    bool b_{};
};

void Fn() noexcept
{
    std::vector<bool> v2; //non-compliant
    std::vector<BoolWrapper> v3{true, false, true, false}; //compliant
}

この例では、ベクトル v2 が非準拠となっています。これは std::vector<bool> で宣言されているためです。考えられる解決方法は、bool をラップする値の型 BoolWrapperstd::vector を使用することです。

チェック情報

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

バージョン履歴

R2019b で導入