AUTOSAR C++14 Rule A8-5-2

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

Описание

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

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

Объяснение

Заключенная в фигурные скобки инициализация:

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

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

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

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

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

    Для получения дополнительной информации смотрите Ambiguous declaration syntax.

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

Реализация Polyspace

В общем случае средство проверки отмечает инициализации объекта obj1 из типа данных Type использование этих форматов:

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

Если obj1 и obj2 имейте отличные типы данных.

Средство проверки включено, только если вы задаете версию 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