isalnum 的范围解析运算符

Scope resolution operator for isalnum

我问这个是 this 问题的后续。上一个问题是快三年前问的了,所以我还是问一个新的问题会更好。

我链接到的那个问题的关键是 OP 试图 运行 以下代码行:

find_if(s.begin(), s.end(), isalnum);

在某个容器上 s。该行代码编译失败,OP应该这样做

find_if(s.begin(), s.end(), ::isalnum);

接受的答案指出 localecctype 库中有 isalnum 函数,并且编译器在消除两者之间的歧义时遇到问题,因此 :: 范围解析操作员。我通过仅包含其中一个库对其进行了测试,但编译器仍然存在消除歧义的问题。这是为什么?如果我只包含其中一个库,那么显然编译器不应该 "know" 关于另一个库,那么为什么会发生冲突?

我的问题的第二部分是 :: 运算符如何告诉我们需要哪个 isalnum 函数?

谢谢

编辑

我知道 :: 运算符告诉我们我们想要的 function/variable 在全局范围内,但这仍然没有回答我的第二个问题。

来自 <locale>isalnum 在命名空间 std 中定义。 <cctype> 中的 isalnum 在命名空间 std 中全局定义,因为 C 库中的符号(可能 [1])在全球范围。使用 ::isalnum 从全局范围请求 isalnum 的版本,而不是从 namespace std.

[1]。该标准保证如果您包含 <ctype.h> 则符号将在全球范围内。对于 C 库头文件,cc* 版本几乎总是如此,尽管严格来说它是实现定义的。

根据我的理解,使用范围解析运算符 (::) 有助于确定程序的范围。

所以如果你有:

Add();     //This is in Global Scope

class Test{
    void Add();       //This is in scope of the "Test" class
    int useAdd(); { ::Add();}
}

所以在这种情况下,useAdd() 函数指的是全局范围内的添加函数,而不是测试 class 中的添加函数。如果您想使用范围解析运算符引用测试 class 中的那个,您可以放置​​ Test::Add() 而不是 ::Add().

在上述情况下,可能是他在当前 class 和全局函数中都实现了 "isalnum" 函数,他需要具体引用全局函数而不是class 函数。

编辑:我想我误解了这个问题,安德鲁比我自己回答得更好。