Универсальная функция, не являющаяся членом, должна объявляться только в пространстве имен, которое не является ассоциированным пространством имен
Универсальная функция, не являющаяся членом, должна объявляться только в пространстве имен, которое не является ассоциированным пространством имен.
Это правило запрещает размещение универсальных функций в том же пространстве имен, что и объявления типа класса (struct), типа перечисления или типа объединения. Если в качестве параметров шаблона используются типы class, enum или union, наличие общих функций в том же пространстве имен может привести к неожиданному разрешению вызовов. Размещайте универсальные функции только в пространствах имен, которые не могут быть связаны с классом, перечислением или типом объединения.
Рассмотрим пространство имен NS который объединяет класс B и общая форма operator==:
namespace NS {
class B {};
template <typename T> bool operator==(T, std::int32_t);
}
B в качестве параметра шаблона для другого общего класса, такого как этот класс шаблона A:template <typename T> class A {
public:
bool operator==(std::int64_t);
}
template class A<NS::B>;
NS используется для разрешения перегрузки при операторах класса A называются. Например, если вы звоните operator== с int32_t аргумент, дженерик operator== в пространстве имен NS с int32_t используется вместо параметра operator== в исходном классе шаблона A с int64_t параметр. Вы или другой разработчик или рецензент кода могут ожидать, что вызов оператора решит operator== в исходном классе шаблона A.Для каждой универсальной функции средство проверки правил определяет, содержит ли пространство имен объявления типов классов, типов перечислений или типов объединения. Если такое объявление найдено, средство проверки помечает нарушение правил на самом операторе.
Средство проверки также помечает универсальные функции, определенные в глобальном пространстве имен, если глобальное пространство имен также имеет объявления класса, перечисления или объединения.
Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.
| Группа: Шаблоны |
| Категория: Обязательно |