但是当范围运算符没有第一个时,它是什么意思
论据?
它表示全局命名空间。
考虑一个简单的例子。让我们假设您定义了函数swap。同时,您包含了标题<utility>,它还包含swap 的声明。并在使用命名空间std的指令之后;要区分它们,您需要使用限定名称。
#include <iostream>
#include <utility>
using namespace std;
void swap( int &x, int &y )
{
std::cout << "Inside ::swap" << std::endl;
int tmp = x;
x = y + 10;
y = tmp + 10;
}
int main()
{
int x = 1;
int y = 2;
std::swap( x, y );
std::cout << "x = " << x << ", y = " << y << std::endl;
x = 1;
y = 2;
::swap( x, y );
std::cout << "x = " << x << ", y = " << y << std::endl;
return 0;
}
输出将是
x = 2, y = 1
Inside ::swap
x = 12, y = 11
在此示例中,::swap 指的是在全局命名空间中定义的函数交换,而std::swap 指的是在标题 <utility> 中的名称空间 std 中声明的标准函数 swap
如果你会写不合格的名字
swap( x, y );
当编译器不知道调用哪个函数时:标准函数 std::swap 或您自己的函数 ::swap
如果要排除指令
using namepsace std;
然后写
swap( x, y );
然后编译器会调用你自己的函数swap。
现在我将解释为什么在您使用标准算法std::transform 的示例中使用::tolower。问题是在 C++ 中有两个函数名为 tolower。其中之一是在标头<cctype> 中声明的C 标准函数,另一个是在标头<locale> 中声明的C++ 函数。 C++ 标准允许将 C 标准函数放置在全局命名空间中。因此使用名称::tolower 允许编译器选择C 标准函数而不是C++ 函数。