微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么声明一个名为 cin 的 std::ifstream 不是编译错误?

如何解决为什么声明一个名为 cin 的 std::ifstream 不是编译错误?

最近,我很好奇如果我声明一个名为 std::ifstreamcin,然后尝试用它读取输入会发生什么。我认为这会导致编译错误,因为编译器无法区分是使用 std::istream 还是 std::ifstream 进行输入操作。这是我编写的用于测试的代码

#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    ifstream cin("math_testprogram.in");

    int N;
    cin >> N; // I expect this line to result in some sort of
              // "reference to cin is ambiguous" error

    cout << N << "\n";

    return 0;
}

当前代码(至少在我的编译器上)尝试从文件中读取 N 而不是标准输入。但是,如果我将 cin >> N 行更改为 std::cin >> N,则程序开始尝试从标准输入读取 N(如预期)。

我的问题是,为什么编译器在这种情况下不报错(我编译这个程序的编译器是 GCC 7.5.0)?我在这里是否有其他误解?

解决方法

相同的标识符可以用于不同的变量:

  • 在不同的命名空间中,以及
  • 在代码块内,内部作用域凌驾于外部作用域之上。

在您的代码中,您会同时完成这两件事。全局对象std::cinmain函数的局部对象cin可以共存,没有问题。

在代码块中声明的名称对更外部的作用域隐藏了相同的名称。在您声明了自己的 cin 之后,您需要编写 std::cin 来获得那个。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。