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

Why does std::stable_partition compile without an explicit namespace specification

我正在 Ubuntu 和

合作
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.2) 

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

提供的示例

然而,这不是一个精确的副本,我从对 <algorithm> header 的 std::stable_partition 的调用中删除了名称空间范围限定符 (std::)。

当我像这样简单地将程序提供给 g++ 时,我希望程序不会编译:

$ g++ -Wall -std=c++14 sp_test.cpp 

然而它编译时没有错误甚至没有警告。

有人知道为什么吗?

它似乎是 using std::stable_partitionalgorithm 的幕后某个地方写的。

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

// 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;
}

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

内搜索

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

内搜索