But what does the scope operator mean when it doesn't have a first
argument?
It denotes the global namespace.
Consider a simple example. Let;s assume that you defined function swap. At the same time you included header <utility> that also contains a declaration of swap. and after it dirrective using namespace std; To distinguihs them you need to use qualified name.
#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;
}
The output will be
x = 2, y = 1
Inside ::swap
x = 12, y = 11
In this example ::swap refers to your function swap defined in the global namespace while std::swap refers to standard function swap declared in name space std in header <utility>
If you will write unqualified name
swap( x, y );
when the compiler will not know which function to call: either standard function std::swap or your own function ::swap
If to exclude directive
using namepsace std;
and write
swap( x, y );
then the compiler will call your own function swap.
Now I will explain why in your example with standard algorithm std::transform there is used ::tolower. The problem is that in C++ there are two functions with name tolower. One of which is C standard function declared in header <cctype> and other is C++ function declared in header <locale>. The C++ Standard allows to place C standard functions in the global namespace. So using name ::tolower allows the compiler to select the C standard function instead of the C++ function.