STL中带有operator ==的命名空间解析

马特·克莱恩

考虑一个简单的类型,它在名称空间中带有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==定义位置的规则

0x499602D2

!(*__first1 == *__first2)发生在std::operator==函数模板中,因此它被视为相关的不合格函数调用表达式,因此在重载解析期间,仅在定义上下文内找到的函数std::operator==和通过ADL找到的函数才是候选函数

显然operator==(const Foo&, const Foo&),在标准比较运算符的定义范围内没有声明。在依赖于参数的查询(ADL)中,将检查每个参数的名称空间以搜索该调用的可行函数,因此这就是operator==在内部定义ANamespace作品的原因。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在 JavaScript 中解析命名空间

来自分类Dev

在 R 中解析嵌套的 XML(带有命名空间)

来自分类Dev

使用具有命名空间的 R 解析 XML

来自分类Dev

使用 C# 解析具有多个命名空间的 Xml

来自分类Dev

使用 PHP 中 RootElement 中的命名空间解析 XML

来自分类Dev

使用命名空间解析XML中的数据

来自分类Dev

在 PHP 中解析 XML 命名空间和模式

来自分类Dev

PHP,解析特定命名空间的所有类,并列出这些类的所有方法

来自分类Dev

将具有多个命名空间的 XML 解析为 JSON - PHP

来自分类Dev

解析Soap响应-XML / XPATH(在soapUI中)(SoapUI响应中的命名空间)

来自分类Dev

HBase中的命名空间?

来自分类Dev

lxml中的命名空间

来自分类Dev

.NET中的命名空间

来自分类Dev

XML中的命名空间

来自分类Dev

如何将带有argparse的AWS Sagemaker SM_USER_ARGS解析为argparse命名空间?

来自分类Dev

SQL Server中带有XQuery的动态命名空间

来自分类Dev

Rails路线:带有变量的命名空间

来自分类Dev

带有命名空间事件的javascript

来自分类Dev

带有 mongoid 的命名空间模型

来自分类Dev

未命名和命名命名空间解析

来自分类Dev

有命名空间而没有命名空间

来自分类Dev

Ruby中的“命名空间”方法

来自分类Dev

Python中的命名空间问题

来自分类Dev

Python与C ++中的命名空间

来自分类Dev

流星中的命名空间集合

来自分类Dev

Laravel中的命名空间视图

来自分类Dev

Python导入中的命名空间

来自分类Dev

从标签中删除命名空间

来自分类Dev

JavaScript中的命名空间问题