2012-02-15 11 views
9

Nosotros (deberíamos saber) que los contenedores de biblioteca estándar de C++, incluido std :: string, no están destinados a ser heredados. Pero aún así, C++ 98/03 nos permitió hacerlo incluso si nos estaba llevando a errores.¿Los contenedores estándares C++ 11 son "definitivos"?

Ahora que la palabra clave final está disponible, ¿esos contenedores de biblioteca estándar están marcados final para evitar el mal uso de la herencia con ellos?

Si no, ¿por qué es eso?

Respuesta

13

El LWG discutió este tema en la reciente reunión en Kona, del 6 al 10 de febrero de 2012. Esto es LWG issue 2113.

El LWG decidió marcar LWG 2113 como NAD (no es un defecto), con el fundamento de que el estándar ya está claro que las clases existentes tales como contenedores y std::string no pueden marcarse como finales por la implementación.

La discusión incluyó el hecho de que si bien puede ser desaconsejable derivar de tales clases, es claramente legal hacerlo en C++ 98/03. Y convertirlo en ilegal en C++ 11 sería romper demasiado código.

actualización

En este momento, no hay tipos de bibliotecas en el current working draft están marcados final.

+0

Gracias por arreglar el tipo-o Jerry. Lo tuve en dos lugares y simplemente arreglé el segundo también. No lo habría notado sin tu ayuda. –

+0

Seguramente. Perdón por haber perdido el segundo. –

2

std::string parece no estar marcado como definitivo, como tampoco lo son los otros contenedores.

Supongo que por qué sería que, aunque no se recomienda generalmente derivar de ellos, nadie estaba seguro de cuánto código de trabajo se rompería si estuviera prohibido.

También tenga en cuenta que, por si vale la pena, final no es técnicamente una palabra clave: es un identificador al que se le atribuye un significado especial, pero solo en circunstancias específicas. El código que contenía algo como int final; final = 1; seguirá funcionando. Sin embargo, esto es principalmente para compatibilidad con versiones anteriores; al menos en el código nuevo, es casi seguro que es mejor usar final solo para el significado especial, no como un identificador normal.

+2

No estoy de acuerdo con la última oración. El objetivo de no convertirlo en una palabra clave es poder tener palabras clave basadas en el contexto. No es confuso decir 'int final;' En contexto, sabemos exactamente lo que significa, así que no hay problema. La confusión ocurriría solo con "palabras clave" que pueden aparecer en el mismo lugar que las expresiones. Y ese no es el caso aquí. –

+0

@NicolBolas Si su objetivo es solo admitir marcadores de sintaxis que contengan un compilador de C++ casi completo, entonces seguro. Pero si evita usar palabras clave sensibles al contexto en otros contextos en el código futuro, su resaltado de sintaxis puede ser preciso sin requerir casi tanta complejidad. – Yakk

Cuestiones relacionadas