That's right, you declare a function named foo, returning a vector of strings and taking two arguments, one iterator named cin, and one unnamed iterator.
That second parameter is an unnamed pointer to a function with no parameters that returns a `std::istream_iterator<std::string>' object.
It doesn't do what you think it does. It does not call the range constructor. It doesn't do anything. It is an illegal line of C++ code. (If it wasn't illegal, it would still be a function declaration.)
But [...] does what you think it does (calling the range constructor of vector with strings read from cin).
For the future, before laying out advice regarding the interpretation of the standard, you will want to try a compiler that isn't "G++" or Sun CC. (Or at least turn G++ up to its most pedantic.) You need to try at least two; no one compiler sets the benchmark for standard behavior.
That is not an ambiguity. An ambiguous statement is a legal statement with several potential, all valid, interpretations.
The ambiguity vanishes as you explicitly declare the namespace, since parameter names cannot contain a '::'.
You've changed a legal, unambiguous statement to an illegal statement.
This opinion is: use 'using' only to prevent name hiding in subclasses, and not for "typing convenience", especially if you didn't spot the problem in my example above.
The above referenced line is illegal. You would still need to use another method "on top" of fully qualifying the name. The problem persists even if you use a `typedef'. (I'm talking about the valid line of C++ source. The illegal line of code would remain illegal.)
Fully qualifying every name at every use is no better than decoration; you've lost all of their utility. You may as well use "__" instead of "::".