Main Content

MISRA C++:2023 Rule 26.3.1

std::vector should not be specialized with bool

Since R2024b

Description

Rule Definition

std::vector should not be specialized with bool.

Rationale

std::vector <bool> behaves differently from other specializations of std::vector. In particular, the elements are not stored as a contiguous array and might show unexpected results when used with other members of the Standard Library.

Polyspace Implementation

The checker reports a violation on the definition of variables with type std::vector <bool>.

Troubleshooting

If you expect a rule violation but Polyspace® does not report it, see Diagnose Why Coding Standard Violations Do Not Appear as Expected.

Examples

expand all

In this example, the std::vector<bool> variable boolVar violates the rule. The violation does not occur if the bool variable is wrapped in a class and std::vector is specialized to that class, as in the case of variable boolWrapperVar.

#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> boolVar;   //Noncompliant
    std::vector<BoolWrapper> boolWrapperVar {true, false, true, false};  //Compliant
}

Check Information

Group: Containers Library
Category: Advisory

Version History

Introduced in R2024b