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