std::string
не помечены как окончательные, как и другие контейнеры.
Я полагаю, почему так, что, хотя вообще не рекомендуется использовать их, никто не был уверен, сколько рабочего кода сломается, если это будет запрещено.
Также обратите внимание, что, во всяком случае, final
технически не является ключевым словом - это идентификатор, к которому прилагается особое значение, но только при определенных обстоятельствах. Код, содержащий что-то вроде int final; final = 1;
, все равно будет работать. Хотя это в основном для обратной совместимости - по крайней мере, в новом коде почти наверняка лучше использовать final
только для специального значения, а не в качестве обычного идентификатора.