exponenta event banner

Правило AUTOSAR C++ 14 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