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

标签 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() 在此处的范围内?

最佳答案

参数相关查找 将考虑命名空间中的函数重载,前提是一个或多个参数的类型也在该命名空间中。在这种情况下,参数类型是 std::string,因此在查找重载时会考虑 namespace std,而 std::left 是找到了。

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

关于c++ - 为什么这个功能进入范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29469691/

相关文章:

c++ - 在递归 C++ 函数中捕获 "Stack Overflow"异常

c# - 使用 C# 和 Visual Studio 创建可以动态更改其形状和位置的形状

sql - 如何在 Visual Studio 中使用 SSDT 重命名表

jquery - __dopostback 未按预期工作

c++ - 什么是 &= 和 |=

c++ - 将 'Stack' 重新定义为不同类型的符号

c++ - 错误 C2011 : 'member' : 'struct' type redefinition on moving a struct to a new header file

c++ - 比较两个字符串数组,我的控制台应用程序 "stops responding"

c++ - 仅在 Visual Studio 外部运行时才能找到文本文件

在 ReadFile() 之上创建异步 "ReadFileMany()"