AUTOSAR C++14 Rule A13-5-3

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

Описание

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

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

Объяснение

Пользовательские операторы преобразования могут вызываться, когда вы не хотите и не ожидаете их вызова, что может привести к неожиданным ошибкам диалога типа. Например, в этом фрагменте кода пользовательский оператор преобразования преобразует тип customType на double чтобы разрешить выражения смешанного режима:

class customType
{
	public:
	customType(int base, int exponent);
	//....
	operator double() const; // Conversion operator, convert customType to double
};

customType var1(2,5);
double var2 = 0.5 * var1; //Conversion operator called, converts var1 to double
В то время как это преобразование может быть ожидаемым, если вы пытаетесь напечатать var1 при помощи cout << var1; без определения operator << для customType объекты, компилятор использует оператор преобразования для неявного преобразования и печати var1 как double.

Чтобы избежать этих неожиданных преобразований, замените оператор преобразования эквивалентной функцией. Затем функция должна быть вызвана явным образом. Если вы не можете избежать использования операторов преобразования в вашем приложении, см. AUTOSAR C++14 Rule A13-5-2 правила.

Реализация Polyspace

Polyspace® помечает все вызовы операторам преобразования.

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

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

Примеры

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

class customType
{
public:
    customType(int base, int exponent): b(base), exp(exponent) { /* ...*/}
    //....
    operator double() const;
    double as_double() const {/* ...*/}

private:
    int b; //base
    int exp; //exponent
};

int func(void)
{

    customType var1(2, 5);
    double var2 = 0.5 * var1; //Non-compliant
    double var3 = 0.5 * var1.as_double(); // Compliant

    return 0;
}

В этом примере преобразование var1 в double в объявлении var2 использует оператор преобразования customType::operator double. Это преобразование не соответствует требованиям, поскольку в нем используется определяемый пользователем оператор преобразования.

Преобразование типов в объявлении var3 является совместимым, потому что он использует функцию для обработки преобразования, и эта функция должна быть вызвана явным образом. Это обеспечивает ожидаемое преобразование.

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

Группа: Перегрузка
Категория: Консультационные, Автоматизированные
Введенный в R2021a