在匿名名称空间中定义自定义相等运算符

Mar*_*ley 4 c++ c++17

我有一个C结构(在C头文件中),如下所示:

struct Foo {
  int a;
  int b;
  int c;
};
typedef struct Foo Foo;
Run Code Online (Sandbox Code Playgroud)

我想测试这些结构的两个向量的相等性,因此我想为我的翻译单元为此结构定义一个自定义的相等运算符。

我能够做到

static inline bool operator==(const Foo&, const Foo&) {...}
Run Code Online (Sandbox Code Playgroud)

但不是

namespace {
    bool operator==(const Foo&, const Foo&) {...}
}
Run Code Online (Sandbox Code Playgroud)

为什么std :: vector的相等模板找不到该运算符,并且有比在全局名称空间中插入静态内联更好的方法吗?

Ben*_*igt 6

我想您会发现,如果该运算符的声明在之前发生,则std::vector实际上在匿名名称空间找到该运算符#include <vector>

在代码中找不到它的原因与模板函数中名称的两阶段查找有关。第一阶段在范围内的所有命名空间中查找候选对象。第二阶段仅查找从属名称。就像短语所说的那样,搜索包含类型的名称空间的“依赖于参数的查找”是依赖的。匿名名称空间中的查找不依赖,因此不会在第二阶段完成。

也可以看看: