为什么std :: stable_partition在没有显式命名空间规范的情况下编译

时间:2016-10-07 20:01:54

标签: c++ namespaces std argument-dependent-lookup

我正在使用

开发Ubuntu
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.2) 

以下代码是cplusplus.com entry about std::stable_partition

提供的示例

这不是一个确切的副本,但是,我从std::标题的std::stable_partition的调用中删除了命名空间范围限定符(<algorithm>)。

我希望程序在我简单地将其提供给g ++时不会编译:

$ g++ -Wall -std=c++14 sp_test.cpp 
然而,它编译时没有任何错误甚至是警告。

有谁知道为什么?

好像它已被using std::stable_partition写在algorithm的某个地方。

我是C ++和g ++的新手,所以我也想知道它是否是一个充分的问题,也就是说,我是否应该为这些(看似)违反g ++的预期行为而烦恼。 / p>

// stable_partition example
#include <iostream>     // std::cout
#include <algorithm>    // std::stable_partition
#include <vector>       // std::vector

bool IsOdd (int i) { return (i%2)==1; }

int main () {
        std::vector<int> myvector;

        // set some values:
        for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9

        std::vector<int>::iterator bound;
        bound = stable_partition (myvector.begin(), myvector.end(), IsOdd);

        // print out content:
        std::cout << "odd elements:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=bound; ++it)
                std::cout << ' ' << *it;
        std::cout << '\n';

        std::cout << "even elements:";
        for (std::vector<int>::iterator it=bound; it!=myvector.end(); ++it)
                std::cout << ' ' << *it;
        std::cout << '\n';

        return 0;
}

1 个答案:

答案 0 :(得分:2)

这是因为argument-dependent lookup。您的实现恰好在std::vector<int>::iterator命名空间内定义std,因此stable_partition的名称查找会在std内隐式搜索。

这不是可移植代码,因为std::vector<int>::iterator可能是某种类型的typedef,它不是在std中直接声明的(它可能在嵌套的命名空间中,或者是具有保留名称的命名空间,或类似的东西),因此依赖于参数的查找不一定会在std内搜索。