AUTOSAR C++14 Rule A13-5-1

Если "оператор []" должен быть перегружен с версией неconst, версия const должна также быть реализована

Описание

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

Если "оператор []" должен быть перегружен с версией неconst, версия const должна также быть реализована.

Объяснение

Как правило, вы перегружаете оператор индекса operator[] обеспечить доступ для чтения и доступ для записи к отдельным элементам массива или подобной структуры, содержавшейся в классе. Если вы реализуете non-const перегрузка operator[], необходимо также реализовать const версия этой перегрузки. В противном случае вы не можете использовать operator[] считать элементы const объект.

Это правило позволяет реализацию const перегрузка operator[] для доступа только для чтения без соответствующего non-const перегрузка.

Реализация Polyspace

Polyspace® отмечает определение non-const функция членства, если никакой соответствующий const версия функции членства реализована.

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

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

Примеры

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

#include <memory>
#include <iostream>

class MyList
{
private:
    static constexpr std::int32_t maxSize = 10;
    std::int32_t container[maxSize];

public:
    std::int32_t& operator[](std::int32_t index) //compliant, non-const version
    {
        return container[index];
    }
    const std::int32_t& operator[](std::int32_t index) const //compliant, const version
    {
        return container[index];
    }
};

class MyList_nc
{
private:
    static constexpr std::int32_t maxSize = 10;
    std::int32_t container[maxSize];

public:
    std::int32_t& operator[](std::int32_t index) //non-compliant, non-const version only
    {
        return container[index];
    }

};

void func() noexcept
{
    MyList list;
    list[2] = 3; // Uses non-const version of operator[]
    std::cout << list[2] << std::endl;

    const MyList clist = {};
    std::cout << clist[2] << std::endl; // Uses const version of operator[]


}

В этом примере, перегрузках operator[] в классе MyList совместимы потому что оба const и non-const версии перегрузки реализованы. В классе MyList_nc, функция членства несовместима потому что только non-const версия была реализована.

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

Группа: Перегрузка
Категория: необходимый, автоматизированный
Введенный в R2020a