std::string ist nunmal nicht automatisch bekannt, wie das für sizeof, new und andere Keywords der Fall ist, die tatsächlich Teil der Sprache sind.
std::string ist kein eingebauter Datentyp, sondern eine Klasse, die im Standard definiert ist. Sie muss, wie std::istream und std:

stream eingebunden werden.
Warum das so gemacht wurde? Es wird sicherlich Argumente dafür gegeben haben. Prinzipiell sind eigentlich alle Datentypen, die nicht auch in C existieren, keine eingebauten Typen.