2016-12-17 38 views
1

我刚刚遇到这样一个事实,即标准algorithm标头中的几种算法不需要std::是否有任何原因find_if,for_each,计数等不需要std ::?

例子:

#include <vector> 
#include <algorithm> 

int main() { 
    std::vector<int> m; 
    count(m.begin(), m.end(), 0); 
    count_if(m.begin(), m.end(), [](auto){return true;}); 
    for_each(m.begin(), m.end(), [](auto){}); 
    find_if(m.begin(), m.end(), [](auto){return true;}); 
} 

Live demo at coliru

是否有任何具体的原因是什么? g++clang++都接受上面的代码。

+5

由于ADL,在你重构使用自定义容器的情况下,最好不要依赖它。 –

+0

https://en.wikipedia.org/wiki/Argument-dependent_name_lookup –

回答

6

这里有两件事。

首先是ADL,或Argument Dependent Name Lookup

该功能通过ADL找到。这是因为一些参数(即vectoriterator类型)位于std中,所以当重载分辨率查找for_each时,它会查看通常的一组命名空间(本例中为root),以及由其参数的命名空间。

诀窍是vector::iterator不保证是在namespace std类型。所以你的代码不能保证工作。它可能std中的一个类型,或者它可能是一个原始指针,或者它可能是namespace __std__utility_types或其他任何地方的一个类型。

所有主要的编译器库都有vector迭代器是非指针,它们在namespace std中,因为替代方案被认为更糟。但缺乏保证意味着您不应该依赖它来获得真正的便携式代码。

+0

我遇到了微软的IDE通过ADL(他们的“编辑助理”IntelliSense)“发现”那些确切功能的问题,但是在编译时编译器没有使用ADL。 – Swift

相关问题