我今天收到了一些代码,它使用 std::string 上的 std::transform 使其全部小写。发件人在 Visual Studio 2010 中编写并编译了代码:
using namespace std;
string test = "TEST";
transform(test.begin(), test.end(), test.begin(), tolower);
当我使用 GCC 和/或 Clang 在 OSx 上编译它时,得到了编译错误,因为它涉及命名空间的冲突。
确实有很多已回答的问题涉及全局命名空间与本地(::tolower 与 std::tolower),但这是关于这段代码实际上适用于 VS 的事实。
我想回答的问题:
- 为什么 Visual Studio 编译这个?
- 当 std:: 应该优先时,它怎么会默认(?)到全局命名空间 :: ?
- 这是一个 ideone 片段(有错误):http: //ideone.com/qvUAMw
- 这是一个ideone片段(有效):http: //ideone.com/lk0H5d
注意:我在 OSx Mountain Lion 上使用 GCC 4.2 和 Clang (425.0.24 LLVM 3.2svn)