AUTOSAR C++ 14 Rule A18-1-2

Станд.:: вектор <bool> специализация не должен использоваться.

Описание

Управляйте определением

Станд.:: вектор <bool> специализация не должен использоваться.

Объяснение

Специализация std::vector для типа bool может быть сделан эффективным пробелом заданным способом реализации. Например, std::vector<bool> не обязательно хранит его элементы как непрерывный массив. В результате специализация не работает как ожидалось со всем стандартным шаблоном библиотеки (STL) алгоритмы, такие как индекс operator[]() который не возвращает непрерывную последовательность элементов. Вы не можете безопасно изменить отличные элементы контейнера STL std::vector<bool>.

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

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

#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>. Возможная фиксация должна использовать std::vector со значением вводят BoolWrapper это переносит bool.

Введенный в R2019b