tiene sirven significado reservadas que programacion para palabras lista identificadores ejemplos cuantas c++ c++11 keyword

sirven - palabras reservadas en c++ y su significado



¿Por qué los reemplazos y los identificadores finales tienen un significado especial en lugar de palabras clave reservadas? (1)

Tanto el especificador de anulación como el especificador final se agregaron en C ++ 11. Se diferencian de otros especificadores agregados a C ++ 11, como constexpr y decltype , en que no son keywords y por lo tanto están disponibles para su uso como identificadores:

int main() { int override = 0 ; // Ok int final = 0 ; // Ok //int constexpr = 0 ; // Error }

Se les conoce como identificadores con significado especial , que se tratan en el borrador de la sección 2.11 de la norma C ++ 11 [lex.name] ( énfasis mío ):

Los identificadores en la Tabla 3 tienen un significado especial cuando aparecen en un contexto determinado. Cuando se hace referencia en la gramática, estos identificadores se usan explícitamente en lugar de usar la producción gramatical del identificador. cualquier ambigüedad en cuanto a si un identificador dado tiene un significado especial se resuelve para interpretar el token como un identificador regular.

y Tabla 3 - Identificadores con listas de significados especiales tanto para anular como para finalizar .

¿Por qué estos dos especificadores terminaron siendo identificadores con un significado especial en lugar de palabras clave ?


Añadir nuevas palabras clave es difícil porque elimina los identificadores del usuario. Termina siendo una compensación entre la elección de identificadores que potencialmente rompen el código antiguo que actualmente usa el identificador o la elección de nombres que es muy improbable que rompan el código antiguo pero que sean feos o que no sean significativos en la forma en que se utilizan.

En este caso específico, la anulación y la finalización final se utilizan en la gramática en lugares donde no pueden aparecer identificadores de usuario. Por lo tanto, en esos lugares, los identificadores pueden tener un significado especial y, fuera de esos contextos, pueden tratarse como un identificador regular, dejando los identificadores disponibles para los usuarios. C++/CLI ha utilizado esta técnica desde 2005 y se denominan palabras clave sensibles al contexto que se tratan en la sección 9.1.1 Identifiers del estándar C ++ / CLI .

Podemos ver en el artículo que aborda las ventajas y desventajas de los diferentes métodos para agregar soporte para los atributos de control virtual en N3163: Anular el control mediante palabras clave contextuales . Se discutieron tres opciones:

  • El uso de [[attributes]] , que se consideró indeseable por razones que incluyen solo son palabras clave disfrazadas ( ejemplo modificado del documento a continuación ):

    class A : public B { virtual void f [[override]] () { ... } virtual void h [[final]] () { ... } };

  • Use palabras clave reservadas, que potencialmente rompen el código existente a menos que se elijan nombres feos ( ejemplo modificado del documento a continuación ):

    class A : public B { virtual void f override_func () { ... } virtual void h final_func () { ... } };

  • Use palabras clave sensibles al contexto, que no rompen el código existente y permite nombres agradables ( ejemplo modificado del papel a continuación ):

    class A : public B { virtual void f() override { ... } virtual void h() final { ... } };

El siguiente párrafo del documento resume el argumento para usar palabras clave sensibles al contexto sobre las otras dos opciones (el énfasis es mío ):

La observación se hizo en Rapperswil de que este enfoque puede dificultar la recuperación de errores y el resaltado de sintaxis. Por ejemplo, el resaltado de sintaxis es un poco más difícil porque, en lugar de resaltar globalmente la palabra clave, debe realizar un análisis para saber si el identificador se encuentra en la ubicación donde tiene un significado especial y debe destacarse. Pero esto no es excepcionalmente difícil, particularmente no en comparación con otras cosas mucho más difíciles que ya tenemos que hacer en C ++ en comparación con otros idiomas.

Estos son pequeños inconvenientes para algunos escritores de compiladores durante una semana, pero son perfectos para los usuarios. Esta es la compensación correcta . De lo contrario, tener feos nombres reservados globalmente (Opción 2) o atributos inadecuados y visiblemente mejorados (Opción 1) hace las cosas más fáciles para algunos compiladores de compiladores durante una semana, pero son cosas con las que millones de usuarios tendrán que vivir para siempre .

Los cambios se aplicaron al estándar a través de N3206: Control de anulación: Eliminación de atributos y N3272: Seguimiento del control de anulación .