AUTOSAR C++14 Rule A13-5-1

Если «оператор []» должен быть перегружен неконстовой версией, также должна быть реализована версия 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