isalnum 的范围解析运算符
Scope resolution operator for isalnum
我问这个是 this 问题的后续。上一个问题是快三年前问的了,所以我还是问一个新的问题会更好。
我链接到的那个问题的关键是 OP 试图 运行 以下代码行:
find_if(s.begin(), s.end(), isalnum);
在某个容器上 s
。该行代码编译失败,OP应该这样做
find_if(s.begin(), s.end(), ::isalnum);
接受的答案指出 locale
和 cctype
库中有 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 函数。
编辑:我想我误解了这个问题,安德鲁比我自己回答得更好。
我问这个是 this 问题的后续。上一个问题是快三年前问的了,所以我还是问一个新的问题会更好。
我链接到的那个问题的关键是 OP 试图 运行 以下代码行:
find_if(s.begin(), s.end(), isalnum);
在某个容器上 s
。该行代码编译失败,OP应该这样做
find_if(s.begin(), s.end(), ::isalnum);
接受的答案指出 locale
和 cctype
库中有 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 函数。
编辑:我想我误解了这个问题,安德鲁比我自己回答得更好。