为什么声明一个名为 cin 的 std::ifstream 不是编译错误?
Why is declaring a std::ifstream called cin not a compilation error?
最近,我很好奇如果我声明一个名为 cin
的 std::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
的全局对象和名为cin
的main
函数的局部对象可以共存没有问题。
在代码块中声明的名称在更外部的作用域中隐藏了相同的名称。在你声明了你自己的 cin
之后,你需要写 std::cin
来获得那个。
最近,我很好奇如果我声明一个名为 cin
的 std::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
的全局对象和名为cin
的main
函数的局部对象可以共存没有问题。
在代码块中声明的名称在更外部的作用域中隐藏了相同的名称。在你声明了你自己的 cin
之后,你需要写 std::cin
来获得那个。