作用域操作符的不同用法
Different use of scope operator
要将字符串转换为小写,我们可以这样做:
#include <iostream>
#include <algorithm>
#include <string>
#include <cctype>
using namespace std;
int main()
{
string str("Sample STRING");
cout << str << endl;
std::transform(str.begin(), str.end(), str.begin(), ::tolower);
cout << str << endl;
return 0;
}
我知道std::transform
是什么;但是作用域操作符::
在函数tolower
前面做什么呢?
如果我删除了作用域操作符,那么编译器会报错函数不匹配。如果我在::
操作符前面添加std
,那么编译器也会抱怨函数不匹配。tolower
前面的作用域操作符的目的是什么?我不知道它叫什么,我到处寻找解释,但无济于事。
- 你应该
#include <algorithm>
使用std::transform
。 - 需要的
tolower
函数在ctype.h
或cctype
中定义。您应该包含这些头文件中的一个。前者在全局命名空间中声明tolower
;后者在std
命名空间中声明它。如果没有::
,您可能会选择在<locale>
头文件中声明的函数模板std::tolower
。当然,这只会发生,因为你有using namespace std;
。这是using namespace std;
如何危险的一个特殊例子。 - 左边没有任何内容的
::
意味着右边的名称将"在全局范围内查找",并将找到全局tolower
而不是std::tolower
。(因此,您应该#include <ctype.h>
以确保您获得全局声明。)
没有左侧的::
绕过查找所有可访问的子作用域,并强制使用根(或全局)作用域。
相关文章:
- 这个指针在c++中的用法
- 当C++中需要自动删除时,这是静态的正确用法吗?
- libstdc++ 文件系统中未初始化的用法?
- 复制和交换习惯用法与移动操作之间的交互
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 命名参数习惯用法和(抽象)基类
- 省略号在C++中的所有用法
- () 在 C++ 11 中的特殊而奇怪的用法?
- 构造函数的用法
- 模板类中自动的类用法不完整
- 这里的 = 运算符有什么用法?
- 什么模板用法在阶乘中更好
- 如果可变长度元素的constexpr用法得到<>
- 为什么 setjmp/longjmp 的这种用法是未定义的行为?
- 访问提升:shared_ptr 主范围外崩溃,断言失败:px != 0.指针的正确用法是什么?
- C++ 中函数中 Const 用法之间的差异
- c++中逗号操作符的语法用法
- 作用域操作符的不同用法
- 移位操作符在类方面的用法
- 这是逗号操作符的可接受用法吗?