2012-02-15 1 views
9

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

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

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

ответ

13

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

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

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

Update

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

+0

Спасибо за исправление типа-Джерри. У меня было это в двух местах, и я тоже исправил вторую. Я бы не заметил этого без вашей помощи. –

+0

Наверняка. Извините, я пропустил второй. –

2

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

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

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

+2

Я не согласен с последним предложением. Весь смысл не делать это ключевым словом - иметь ключевые слова на основе контекста. Это не смущает сказать «int final»: «В контексте мы точно знаем, что это значит, поэтому проблем нет. Путаница произойдет только с «ключевыми словами», которые могут появляться в том же месте, что и выражения. И здесь дело не в этом. –

+0

@NicolBolas Если ваша цель - поддерживать синтаксические выделения, содержащие почти полный компилятор C++, тогда обязательно. Но если вы избегаете использования контекстно-зависимых ключевых слов в других контекстах будущего кода, подсветка синтаксиса может быть точной, не требуя почти такой же сложности. – Yakk