考虑一个简单的类型,它在名称空间中带有operator==
:
namespace ANamespace {
struct Foo { int i; float f; };
}
#ifdef INSIDE
namespace ANamespace {
bool operator==(const Foo& l, const Foo& r)
{
return l.i == r.i && l.f == r.f;
}
}
#else
bool operator==(const ANamespace::Foo& l, const ANamespace::Foo& r)
{
return l.i == r.i && l.f == r.f;
}
#endif
bool compareElements(const std::vector<ANamespace::Foo>& l, const std::vector<ANamespace::Foo>& r)
{
return l == r;
}
如果operator==
在内部ANamespace
定义了if (通过定义INSIDE
),则该示例进行编译。但是,如果operator==
在全局名称空间中定义了(这种#else
情况),该函数将compareElements()
无法编译-在GCC和Clang中,以及在libstdc ++和libc ++中都不能编译。全部都按照以下方式发出模板错误:
In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../include/c++/9.2.0/vector:60:
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../include/c++/9.2.0/bits/stl_algobase.h:820:22: error: invalid operands to binary expression ('const ANamespace::Foo' and 'const ANamespace::Foo')
if (!(*__first1 == *__first2))
~~~~~~~~~ ^ ~~~~~~~~~
...
但是,直接比较Foo
函数中的两个,例如
bool compareDirectly(const ANamespace::Foo& l, const ANamespace::Foo& r)
{
return l == r;
}
无论operator==
定义在哪里,似乎都能正常工作。
标准中是否有关于STLoperator==
定义位置的规则?
!(*__first1 == *__first2)
发生在std::operator==
函数模板中,因此它被视为相关的不合格函数调用表达式,因此在重载解析期间,仅在定义上下文内找到的函数std::operator==
和通过ADL找到的函数才是候选函数。
显然operator==(const Foo&, const Foo&)
,在标准比较运算符的定义范围内没有声明。在依赖于参数的查询(ADL)中,将检查每个参数的名称空间以搜索该调用的可行函数,因此这就是operator==
在内部定义ANamespace
作品的原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句