exponenta event banner

Правило AUTOSAR C++ 14 A18-1-2

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

Описание

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

Специализация std:: vector < 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.

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

Группа: 18 Библиотека языковой поддержки
Категория: Обязательно, Автоматизировано
Представлен в R2019b