exponenta event banner

Правило AUTOSAR C++ 14 A13-5-1

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

Описание

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

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

Объяснение

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

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

Внедрение Polyspace

Polyspace ® помечает определение не-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 и не-const реализованы варианты перегрузки. В классе MyList_nc, функция-член не соответствует, поскольку только не -const была реализована версия.

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

Группа: Перегрузка
Категория: Обязательно, Автоматизировано
Представлен в R2020a