gpt4 book ai didi

c++ - 了解运算符查找;哪个编译器是正确的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:46 26 4
gpt4 key购买 nike

以前可能有人问过这个问题,但我没有找到答案......

我有一个无序容器(即散列;我们称它为 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++,一切都很好。但是,当尝试在 Foo 的实例上使用 == 时,clang 在 qhash.h 的内部给出了一个关于 invalid operands to binary expression 的错误.在我看来,clang 要么没有找到要么拒绝了匿名命名空间中 operator== 的定义,这可能是由于与 G++ 不同的查找规则。

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

附注我正在以 C++11 模式构建,以防它有所作为。

最佳答案

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

注意最后一句话。

因此,对于原始示例,运营商没有帮助,gcc 错误,clang 正确。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com