AUTOSAR C++14 Rule A23-0-1

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

Описание

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

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

Объяснение

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

Например, рассмотрите 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 и для присвоения на итераторы 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

Средство проверки отмечает преобразования из типа 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