AUTOSAR C++14 Rule A3-1-5

Определение функции должно быть помещено в определение класса, только если (1) функция предназначена для встраивания (2) это представитель шаблон функции (3) это представитель функция шаблона класса

Описание

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

Определение функции должно быть помещено в определение класса, только если (1) функция предназначена для встраивания (2) это представитель шаблон функции (3), это представитель функция шаблона класса.

Объяснение

Размещение определения функции в определении класса допускается только в том случае, если:

  • Функция предназначена для встраивания. Размещение определения функции представителя в определении класса предписывает компилятору встроить функцию представителя. Введение небольших функций избегает служебных расходов во время выполнения вызовов функций и улучшает эффективность скомпилированного исполняемого файла. Но если вы поместите определение функции большого представителя в определение класса, не зная об этом неявном встраивании, скомпилированный исполняемый файл может быть слишком большим.

  • Функция является представителем шаблоном функции или представителя шаблона класса. Эти методы кодирования сокращают повторения элементов синтаксиса шаблона (для примера, список параметров). Это сокращение улучшает читаемость и поддерживаемость кода.

Реализация Polyspace

Чекер использует эвристический, который, если вы явным образом не используете inline ключевое слово, вы намерены встроить только маленькие функции, которые состоят не более чем из одного оператора. Проверка интерпретирует AUTOSAR C++ 14 Rule A3-1-5 следующим образом.

Для нешаблонов представителей и функций представителей нешаблонов, checker помечает функции one-line представителей, заданные вне класса и большие функции представителей, заданные внутри класса.

Для функций представителя шаблона и функций представителя классов шаблона, проверяющая средство помечает любую функцию представителя, которая задана вне класса.

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

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

Примеры

расширить все

#include <cstdint>
#include <iostream>

class A
{
	private:
	std::uint32_t val = 5;
	
	public:
	std::uint32_t Foo()  // Compliant with (1)
	{
		return val;
	}
	
	std::uint32_t Bar(); 
};

std::uint32_t A::Bar() // Noncompliant with (1)
{
	return (val + 5);
} 

std::uint32_t main()
{
	A a;
	std::cout << a.Foo() << std::endl;
	std::cout << a.Bar() << std::endl;
	return 0;
}

Размещение определения Bar вне определения класса A нарушает правило, потому что Bar состоит из одного оператора.

#include <cstdint>
#include <iostream>

class A
{
  public:
    template <typename T>     // Compliant with (2)
    void Foo(T t)
    {
      std::cout << "This function is defined inside with param: " 
      << t << std::endl;
    }

    template <typename T>     // Non-compliant with (2)
    void Bar(T t);
};


template <typename T>
void A::Bar(T t)
{
  std::cout << "This function is defined outside with param: " 
  << t << std::endl;
}

std::uint32_t main(void)
{
  A a;
  a.Foo<float>(3.14f);
  a.Bar<std::uint32_t>(5);
  return 0;
}

Размещение определения шаблона функции представителя Bar вне определения класса A нарушает правило.

#include <cstdint>
#include <iostream>

template <typename T>
class B
{
  public:
    B(const T x) : t(x) {}

    void display()   //Compliant with (3)
    {
      std::cout << t << std::endl;
    }

    void display2();   //Non-compliant with (3)

  private:
    T t;
};

template <typename T>
void B<T>::display2()
{
  std::cout << t << std::endl;
}

int main(void)
{
  B<std::int32_t> b(7);
  b.display();
  b.display2();
  return 0;
}

Размещение определения функции представителя display2 вне определения шаблона класса B нарушает правило.

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

Группа: Основные концепции
Категория: Требуемая, Частично автоматизированная
Введенный в R2020b