Являются ли стандартные контейнеры C ++ 11 "финальными"? - PullRequest
14 голосов
/ 15 февраля 2012

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

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

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

Ответы [ 2 ]

17 голосов
/ 15 февраля 2012

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

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

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

Обновление

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

2 голосов
/ 15 февраля 2012

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

Я полагаю, почему так, что, хотя вообще не рекомендуется использовать их, никто не был уверен, сколько рабочего кода сломается, если это будет запрещено.

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

...