exponenta event banner

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