为什么这个功能进入范围?
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
;它几乎总是会导致内存泄漏。
针对 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
;它几乎总是会导致内存泄漏。