AUTOSAR C++14 Rule A23-0-1

Итератор не должен быть неявно преобразован в const_iterator

Описание

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

Итератор не должен быть неявно преобразован в const_iterator.

Объяснение

Стандарт C++ 11 вводит функции-члены, такие как cbegin и cend который возвращает соединительные итераторы в контейнеры. Чтобы создать const итераторов, используйте эти представителей функции вместо таких функций, как begin и end которые возвращают неконстовые итераторы и затем требуют неявных преобразований.

Для образца рассмотрим std::list контейнер:

std::list<int> aList = {0, 0, 1, 2};
Можно использовать begin и end Представитель функции контейнера, чтобы создать const итераторов, для образца в for цикл:
for(std::vector<int>::const_iterator iter{aList.begin()}, end{aList.end()};
    iter != end;
    ++iter) {...}
Однако функции begin и end возвращает неконст- итераторы и для назначения в const итераторов iter и end соответственно, должно произойти неявное преобразование. Вместо этого воспользуйтесь новыми функциями C++ 11 cbegin и cend который непосредственно возвращает const итераторы:
for(std::vector<int>::const_iterator iter{aList.cbegin()}, end{aList.cend()};
    iter != end;
    ++iter) {...}
Если вы используете эти функции, можно также заменить явную спецификацию типов итераторов на auto:
for(auto iter{aList.cbegin()}, end{aList.cend()};
    iter != end;
    ++iter) {...}

Реализация Polyspace

Флажки Checker преобразуются в iterator типа на const_iterator или reverse_iterator на const_reverse_iterator.

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

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

#include <cstdint>
#include <vector>

void func(std::vector<int32_t> & values, int32_t aValue) {
    std::vector<int32_t>::const_iterator iter1 = 
                  std::find(values.begin(), values.end(), aValue); //Noncompliant
    std::vector<int32_t>::const_iterator iter2 = 
                  std::find(values.cbegin(), values.cend(), aValue);  //Compliant
}

В этом примере первый std::find вызов функции использует в качестве аргументов возврата значения begin и end методы std::vector контейнер values. Эти методы возвращают итераторы типа std::vector<intr32_t>::iterator. Начиная с std::find шаблон имеет тот же тип возврата, что и типы первых двух аргументов, он также возвращает итератор типа std::vector<intr32_t>::iterator. Значение возврата присваивается переменной типа std::vector<intr32_t>::const_iterator, в результате чего происходит неявное преобразование.

Второй вызов использует cbegin и cend методы, которые возвращают итераторы типа std::vector<intr32_t>::const_iterator и избегайте неявного преобразования.

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

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