编译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()在这里?
答案 0 :(得分:4)
参数依赖查找将考虑命名空间中的函数重载。在这种情况下,参数类型为std::string
,因此在查找重载时会考虑namespace std
,并找到std::left
。
顺便说一句,永远不要在实际代码中写*new
;它几乎总是会导致内存泄漏。