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