AUTOSAR C++14 Rule A13-2-2

Оператор двоичной арифметики и побитовый оператор должны возвратить "prvalue"

Описание

Управляйте определением

Оператор двоичной арифметики и побитовый оператор должны возвратить "prvalue".

Объяснение

Операторы двоичной арифметики, такие как operator+() и побитовые операторы, такие как operator|() должен возвратить объект типа T значением без спецификаторов (и не ссылки, T&, или указатели, T*). Это требование делает типы возврата сопоставимыми с реализацией тех же операторов в Библиотеке Стандарта C++. Разработчик, знакомый со стандартными операторами, может легко работать с перегруженными формами операторов.

prvalue или чистый rvalue являются объектом, который не имеет имени, не может быть указан или сослан, но может все еще быть перемещен от. Например, результатом вызова функции, которая возвращается значением, является prvalue.

Реализация Polyspace

Средство проверки отмечает реализации бинарных операторов и побитовых операторов, которые возвращаются:

  • Тип со спецификатором, таким как const или volatile.

  • Указатель или ссылка на другой тип.

Операторы, отмеченные средством проверки, включают:

  • Бинарные операторы, такие как operator+()оператороператор, и так далее.

  • Побитовые операторы, такие как operator&(), operator|(), operator<<(), и так далее.

    Обратите внимание на то, что средство проверки не показывает нарушения на operator<<() и operator>>() тот возврат std::basic_istream, std::basic_ostream, или std::basic_iostream типы.

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

Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.

Примеры

развернуть все

#include <cstdint>

class A
{
};
class B
{
};

A* operator+(A const&, A const&) noexcept //Noncompliant
{
  return new A{};
}
B operator+(B const&, B const&) noexcept //Compliant
{
  return B{};
}

const A operator*(A const&, A const&) noexcept //Noncompliant
{
  return A{};
}
B operator*(B const&, B const&) noexcept //Compliant
{
  return B{};
}

std::int32_t* operator/(A const&, A const&) noexcept //Noncompliant
{
  return 0;
}
std::int32_t operator/(B const&, B const&) noexcept //Compliant
{
  return 0;
}

В этом примере, перегрузки оператора, которые берут операнды типа A возвратите объекты, которые не являются prvalues. Следовательно, эти операторы нарушают правило. Например:

  • operator+ и operator/ возвратите указатели на объекты.

  • operator* возвращает const- квалифицированный объект.

Эквивалентные перегрузки оператора для типа B возвратите объекты значением без спецификаторов и выполните правило.

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

Группа: Перегрузка
Категория: необходимый, автоматизированный
Введенный в R2021a