AUTOSAR C++14 Rule A13-5-2

Все пользовательские операторы преобразования должны быть заданы явные

Описание

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

Все пользовательские операторы преобразования должны быть заданы явные.

Объяснение

Если вы не задаете пользовательский оператор преобразования с explicit спецификатор, компиляторы могут выполнить неявные и часто непреднамеренные преобразования типов от типа класса возможно неожиданными результатами.

Неявное преобразование может произойти, например, когда функция принимает параметр типа, отличающегося от типа класса, который вы передаете в качестве аргумента. Например, вызов func здесь вызывает неявное преобразование из типа myClass к int:

class myClass {} {
  ...
  operator int() {...}
};
myClass myClassObject;

void func(int) {...}
func(myClassObject);

Реализация Polyspace

Средство проверки отмечает объявления или в определениях классов пользовательских операторов преобразования, которые не используют explicit спецификатор.

Например, operator int() {} может преобразовать переменную текущего типа класса к int переменная и неявно и явным образом но explicit operator int() {} может только выполнить явные преобразования.

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

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

Примеры

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

#include <cstdint>

class MyClass {
public:
    explicit MyClass(int32_t arg): val(arg) {};
    operator int32_t() const { return val; }  //Noncompliant
    explicit operator bool() const {   //Compliant
        if (val>0) {
          return true;
        }
        return false;
     } 
private:
    int32_t val;
};

void useIntVal(int32_t);
void useBoolVal(bool);

void func() {
    MyClass MyClassObject{0};
    useIntVal(MyClassObject); 
    useBoolVal(static_cast<bool>(MyClassObject));
}

В этом примере, оператор преобразования operator int32_t() не задан с explicit спецификатор и нарушает правило. Оператор преобразования operator bool() задан явный и не нарушает правило.

При преобразовании в bool переменная, например, в вызове useBoolVal, explicit ключевое слово в операторе преобразования гарантирует, что необходимо выполнить явное преобразование из типа MyClass к bool. Нет такого требования при преобразовании в int32_t переменная. В вызове useIntVal, выполняется неявное преобразование.

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

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