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