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

  ambiguous, c++, ifstream, istream

Recently, I was curious as to what would happen if I declared a std::ifstream called cin, then tried to read input with it. I thought that this would result in a compilation error, because the compiler wouldn’t be able to differentiate whether to use the std::istream or the std::ifstream for the input operation. Here’s the code I wrote to test this:

#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;

The current code (on my compiler, at least) tries to read N from the file instead of standard input. If I change the cin >> N line to std::cin >> N, however, then the program starts trying to read N from standard input (as expected).

My question is, why doesn’t the compiler give an error in this case (the compiler I compiled this program with is GCC 7.5.0)? Is there some other misconception that I’m making here?

Source: Windows Questions C++