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