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

时间:2015-04-06 10:43:27

标签: c++ visual-studio visual-c++ scope

编译Visual C ++ 2003到2013时出现此错误。编译g ++ 4.9.2时不存在此错误。

#include <ios>

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

   return 0;
}

问题是它报告了一些关于参数的错误。我期望的结果是它说“找不到标识符”,因为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()在这里?

1 个答案:

答案 0 :(得分:4)

如果一个或多个参数的类型也在该命名空间中,

参数依赖查找将考虑命名空间中的函数重载。在这种情况下,参数类型为std::string,因此在查找重载时会考虑namespace std,并找到std::left

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