Por que o iostream :: eof dentro de uma condição de loop é considerado errado?

Acabei de encontrar um comentário emest responda dizendo que usandoiostream::eof em uma condição de loop é "quase certamente errado". Eu geralmente uso algo comowhile(cin>>n) - que eu acho que verifica implicitamente o EOF, por que verificar o eof explicitamente usandoiostream::eof errado?

Como é diferente de usarscanf("...",...)!=EOF em C (que costumo usar sem problemas)?

questionAnswers(4)

yourAnswerToTheQuestion