为什么这个功能进入范围?

Why is this function coming into scope?

针对 Visual C++ 2003 到 2013 进行编译时会出现此错误。针对 g++ 4.9.2 进行编译时不会出现此错误。

#include <ios>

int main() {
   left(*(new std::string));

   return 0;
}

问题是它报告了一些关于参数的错误。我期望的结果是它说 "identifier not found" 因为 std::left() 应该超出范围!

复制的内联函数示例:

STD_BEGIN
inline std::ios_base& __CLRCALL_OR_CDECL left2(std::ios_base& _Iosbase) {
   _Iosbase.setf(std::ios_base::left, std::ios_base::adjustfield);
   return (_Iosbase);
}
_STD_END

我检查了 ios,发现它是一个内联函数。我将其复制出来,使用相同的宏将其粘贴到 std 命名空间中,并给它起了一个新名称。但是新功能超出了范围?

那么为什么 std::left() 和 std::right() 在此处的范围内?

参数相关查找 将考虑名称空间中的函数重载,前提是一个或多个参数的类型也在该名称空间中。本例中参数类型为std::string,所以查找重载时考虑namespace std,找到std::left

顺便说一下,永远不要在真正的代码中写 *new;它几乎总是会导致内存泄漏。