On Wed, Apr 24, 2013 at 5:25 AM, Nathan Ridge <zeratul...@hotmail.com> wrote: >> Here's a simple program: >> >> #include <algorithm> >> #include <vector> >> >> int main() >> { >> std::vector<int> vec; >> count(vec.begin(), vec.end(), 0); // shouldn't this be std::count ? >> } >> >> The above compiles successfully, but I think it shouldn't. I expect a >> message like "error: `count` not declared in scope" because I meant to >> say std::count. Isn't this a bug, or am I missing something? > > It is not a bug. std::count is being found by argument-dependent lookup [1]. > > Regards, > Nate > > [1] http://en.wikipedia.org/wiki/Argument-dependent_name_lookup
For completeness (or something closer to it): the code is non-portable, as the C++ Standard doesn't say in which namespace the type named by std::vector<T>::iterator is defined. It's commonly either (a) in namespace std, in which case the code above compiles, or (b) a raw pointer, in which case the code above does not compile. It's also entirely possible that switching from a debug build to a non-debug one might change from (a) to (b) with the same compiler and library. -- James