Универсальный оператор, не являющийся членом, должен быть объявлен только в пространстве имен, которое не содержит объявлений типа класса (struct), типа перечисления или типа объединения.
Универсальный оператор, не являющийся членом, должен быть объявлен только в пространстве имен, которое не содержит объявлений типа класса (struct), типа перечисления или типа объединения.
Это правило запрещает размещение универсальных операторов в том же пространстве имен, что и объявления типа класса (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.Для каждого универсального оператора средство проверки правил определяет, содержит ли пространство имен объявления типов классов, типов перечислений или типов объединения. Если такое объявление найдено, средство проверки помечает нарушение правил на самом операторе.
Средство проверки также помечает универсальные операторы, определенные в глобальном пространстве имен, если глобальное пространство имен также имеет объявления класса, перечисления или объединения.
Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.
| Группа: Шаблоны |
| Категория: Консультации, Автоматизированные |