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

Why is declaring a std::ifstream called cin not a compilation error?

最近,我很好奇如果我声明一个名为 cinstd::ifstream,然后尝试用它读取输入会发生什么。我认为这会导致编译错误,因为编译器无法区分是使用 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::cin的全局对象和名为cinmain函数的局部对象可以共存没有问题。

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