AUTOSAR C++ 14 Rule 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 Language Support Library
Категория: Необходимый, Автоматизированный
Введенный в R2019b