我正在使用
开发Ubuntugcc 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;
}
答案 0 :(得分:2)
这是因为argument-dependent lookup。您的实现恰好在std::vector<int>::iterator
命名空间内定义std
,因此stable_partition
的名称查找会在std
内隐式搜索。
这不是可移植代码,因为std::vector<int>::iterator
可能是某种类型的typedef,它不是在std
中直接声明的(它可能在嵌套的命名空间中,或者是具有保留名称的命名空间,或类似的东西),因此依赖于参数的查找不一定会在std
内搜索。