AUTOSAR C++14 Rule A3-1-5

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

Описание

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

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

Объяснение

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

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

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

Реализация Polyspace

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

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

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

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

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

#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