exponenta event banner

Правило AUTOSAR C++ 14 A3-1-5

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

Описание

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

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

Объяснение

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

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

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

Внедрение Polyspace

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

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

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

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

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

Примеры

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

#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