
SELECT_CATALOG_ROLE is more restrictive than SELECT ANY DICTIONARY. Although both have privileges to select from the dictionary views, SELECT ANY DICTIONARY allows the user to see the source code of package bodies and triggers which are normally available to the DBAs.
SELECT ANY DICTIONARY is a system privilege, while SELECT_CATALOG_ROLE is a role.
SELECT_CATALOG_ROLE allows the user to query V$SESSION but not to create a procedure. In order to create an object on the base object, the user must have the direct grant on the base object, not through a role.
So while both allow the users to query V$DATAFILE, the role does not allow the users to create objects; the system privilege does.