调用反向函数的代码在 Ubuntu 18 上无法在 g++ 或 clang++ 上编译,但神秘地在 mac osx 上运行

Code calling reverse function does not compile on either g++ or clang++ on Ubuntu 18, but mysteriously works on mac osx

在 Mac OSX,clang 版本 7.0.2 代码编译。 在 Ubuntu clang 版本 7.0.0 上没有。某些默认库真的有区别吗,这看起来很奇怪?

MWE:

#include <string>
using namespace std;
int main() {
    string A = "abc";
    reverse(A.begin(), A.end());
}

是否真的以某种方式引入了算法,但两个版本之间存在差异?

是的,默认库在具有不同编译器的不同系统上有所不同。如果您使用某个功能,请包括相应的 header。在您的 Mac 上,反向函数似乎包含在字符串 header 的某个深处。 使用 #include <algorithm>,它应该也适用于其他系统。

MacOS 上的默认标准库是 libc++。 Ubuntu 上的默认标准库是 libstdc++。

您可以通过将 -stdlib=libc++ 传递给编译器来尝试 Ubuntu,看看会发生什么。

不同之处在于(我怀疑,但不确定)在 libc++ 上 string::iterator 是命名空间 std 中的一种类型,因此会进行 ADL 查找,但在 libstdc++ 中,迭代器只是 char *,并且由于它们不存在于命名空间 std 中,因此不会在该命名空间中进行查找。