exponenta event banner

Правило AUTOSAR C++ 14 A8-5-2

{} без знака равенства используется для инициализации переменной

Описание

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

{} без знака равенства используется для инициализации переменной.

Объяснение

Инициализация с уклоном:

classType Object{arg1, arg2, ...};
менее неоднозначен, чем другие формы инициализации. Встроенная инициализация имеет следующие преимущества:

  • Предотвращает неявное сужение преобразований, например, от double кому float.

  • Избегает неоднозначного синтаксиса, который приводит к проблеме большинства vexing синтаксиса.

    Например, из объявления:

    ResourceType aResource();
    Не сразу понятно, aResource является функцией, возвращающей переменную типа ResourceType или объект типа ResourceType.

    Дополнительные сведения см. в разделе Ambiguous declaration syntax.

Правило также запрещает использование = подписать для инициализации, поскольку = знак может создавать впечатление, что конструктор назначения или копирования вызывается, даже если это не так.

Внедрение Polyspace

Как правило, средство проверки выполняет инициализацию объекта obj1 типа данных Type используя следующие форматы:

  • Type obj1 = obj2;
  • Type obj1(obj2);

Средство проверки допускает исключение для следующих случаев:

  • Инициализация переменных с типом auto использование простого назначения

  • Инициализация ссылочных типов с использованием простого присвоения

  • Объявления с глобальной областью с использованием формата Type a() где Type является типом класса с конструктором по умолчанию. Анализ интерпретирует a как функция, возвращающая тип Type.

  • Инициализация переменной цикла в OpenMP параллельно for петли, то есть в for операторы цикла, которые немедленно следуют #pragma omp parallel for

Проверка включена только при указании версии C++ C + 11 или более поздней. ПосмотритеC++ standard version (-cpp-version).

Поиск неисправностей

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

Примеры

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

class ResourceType {
      int memberOne;
      int memberTwo;
    public:
      ResourceType() {memberOne = 0; memberTwo = 0;}
      ResourceType(int m, int n) {memberOne = m; memberTwo = n;}
      ResourceType(ResourceType &anotherResource) {
          memberOne = anotherResource.memberTwo;
          memberTwo = anotherResource.memberOne;
      }
};

void func() {
    ResourceType aResourceOne(); //Noncompliant
    ResourceType aResourceTwo(1, 2); //Noncompliant
    ResourceType aResourceThree = {1,2};   //Noncompliant
     
    ResourceType aResourceFour{1,2}; //Compliant

}

В этом примере функция func объявляет четыре объекта типа ResourceType. Только объявление aResourceFour не нарушает это правило.

Заявления aResourceOne, aResourceTwo и aResourceThree нарушать правило. В частности:

  • Объявление aResourceOne страдает от проблемы бестолкового синтаксического анализа. Неясно, aResourceOne является объектом типа ResourceType или функция, возвращающая объект типа ResourceType.

  • Объявление aResourceThree кажется, предполагает, что конструктор копирования ResourceType(ResourceType &) вызывается для инициализации. Конструктор копирования инициализирует элемент данных memberOne на 2 и memberTwo на 1. Однако конструктор ResourceType(int, int) вызывается. Этот конструктор инициализирует элемент данных memberOne в 1 и memberTwo на 2.

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

Группа: Деклараторы
Категория: Обязательно, Автоматизировано
Представлен в R2019a