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

Reply via email to