Являются ли стандартные контейнеры С++ 11 "окончательными"?

Мы (должны) знать, что контейнеры стандартной библиотеки C++, включая std::string, не предназначены для наследования. Но все же, C++ 98/03 позволил нам сделать это, даже если это приводило к ошибкам.

Теперь, когда ключевое слово final доступно, помечены ли эти контейнеры стандартной библиотеки как final чтобы предотвратить неправильное использование наследования с ними?

Если нет, то почему?

Ответ 1

LWG обсудила этот вопрос на недавней встрече в Коне 6-10 февраля 2012 года. Это LWG вопрос 2113.

LWG решила пометить LWG 2113 как NAD (не дефект), с обоснованием того, что стандарт уже ясно, что существующие классы, такие как контейнеры и std::string, не могут быть отмечены окончательными реализацией.

Обсуждение включало в себя тот факт, что, хотя его можно смутить, чтобы извлечь из таких классов, в С++ 98/03 это вполне законно. И сделать это незаконным в С++ 11 сломал бы слишком много кода.

Обновление

В настоящее время никакие типы библиотек в текущий рабочий проект не помечены final.

Ответ 2

std::string, по-видимому, не помечен как окончательный, так и другие контейнеры.

Мое предположение о том, почему, хотя в принципе не рекомендуется, исходя из них, никто не был уверен, насколько рабочий код сломается, если это будет запрещено.

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