为什么 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_partition
在 algorithm
的幕后某个地方写的。
我是 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
.
内搜索
我正在 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_partition
在 algorithm
的幕后某个地方写的。
我是 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
.