之前可能会问这个问题,但我没有运气找到答案......

我有一个无序的容器(即散列;我们将其称为 QHash,因为它是,尽管这可能发生在任何类似的情况下)需要一个比较运算符的键类型。

考虑以下:

// foo.h
class Bar
{
public:
    class Foo {};
};

// foo.cpp
#include <QtCore/QHash>

namespace
{
    typedef Bar::Foo Foo;
    bool operator==(Foo const& a, Foo const& b) { return &a == &b; }
}

uint qHash(Foo const& foo) { return qHash(&foo); }

int main()
{
    QHash<Foo, int> hash;
    // do stuff with hash, e.g.:
    hash.insert(Foo(), 5);
    return 0;
}

使用 G++,一切都很好。然而,clang 在 qhash.h 的内部给出了一个关于 invalid operands to binary expression 的错误,其中试图在 == 的实例上使用 Foo 。在我看来,clang 没有找到或拒绝匿名命名空间中 operator== 的定义,这可能是由于与 G++ 不同的查找规则。

我想知道,哪个编译器是正确的?

附言我正在以 C++11 模式构建,以防万一。

最佳答案

好吧,ADL 查看定义类的命名空间。看

[basic.lookup.argdep]/2:
“对于函数调用中的每个参数类型 T,都有一组零
或更多关联的命名空间和一个
要考虑的零个或多个相关类的集合。的套
命名空间和类被确定
完全由函数参数的类型(以及
任何模板模板参数)。
用于指定类型的 Typedef 名称和 using 声明不
为这组做出贡献。”

注意最后一句话。

因此,对于原始示例, namespace 中的 typedef
接线员没有帮助,
gcc 是错误的,clang 是正确的。

关于c++ - 理解运算符查找;哪个编译器是正确的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26740071/

10-11 18:04