MISRA C++:2008 Rule 14-6-2

Функция, выбранная разрешением перегрузки, должна разрешиться до функции, объявленной ранее в модуле перевода

Описание

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

Функция, выбранная разрешением перегрузки, должна разрешаться до функции, объявленной ранее в модуле перевода.

Объяснение

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

Чтобы удовлетворить ожиданию того, что вызов функции всегда разрешается к ранее объявленной функции, объявите перегрузки функции перед вызовом ее. Кроме того, используйте оператор разрешения возможностей видимости :: или круглые скобки, чтобы явным образом вызвать конкретную ранее объявленную функцию и обойти механизм разрешения перегрузки.

Реализация Polyspace

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

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

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

Примеры

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

void show (int);

namespace helpers {
      struct params {
         operator int () const;
      };
}

template <typename T> void displayParams(T const & arg) {
      show(arg);    //Non-compliant
      :show(arg);  //Compliant 
      (show)(arg);  //Compliant
}

namespace helpers {
      void show (params const &);
}

void main() {
      helpers::params aParam;
      displayParams(aParam);
}

В этом примере вызов show(arg) в шаблоне displayParams решает, чтобы helpers::show(), но разработчик или рецензент кода может не ожидать этого разрешения вызова, так как helpers::show() объявляется позже. Polyspace® помечает этот вызов.

Область вызовов ::show(arg) и (show)(arg) явным образом указать ранее объявленную функцию show() объявлен в глобальном пространстве имен. Polyspace не помечает эти вызовы.

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

Группа: Шаблоны
Категория: Требуемая
Введенный в R2013b