sintaxis programa lenguaje funciones ejemplos comandos codigos basicos c++ c++11 keyword c++14

programa - ¿C++ 14 agrega nuevas palabras clave a C++?



programa c++ (3)

Estoy publicando esta respuesta por el simple hecho de dar herramientas para encontrar respuestas a preguntas similares.

El borrador estándar actualmente se guarda en un repositorio público de GitHub. ¡Eso significa que puedes hacer esta pregunta a GitHub mismo!

La tabla de palabras clave está en el archivo source/lex.tex . Si le echas la culpa, podemos encontrar que el último cambio en la tabla de palabras clave tuvo lugar en agosto de 2011 (en realidad es el primer compromiso: esa tabla no ha cambiado desde que el repositorio comenzó a funcionar en el momento C ++ 11) estaba siendo finalizado).

Alternativamente, podemos pedirle a GitHub que compare los dos borradores que se enviaron para las dos versiones del estándar: N3337 y N3936. Una diferencia entre esos dos muestra que los cambios en lex.tex no cambiaron nada en la tabla de palabras clave.

El Comité de estándares de C ++ tiende a evitar agregar nuevas palabras clave al lenguaje, pero con C ++ 11 ese no era el caso. Algunos ejemplos:

constexpr decltype thread_local auto // New usage noexcept nullptr static_assert alignof alignas

¿Hay alguna palabra clave nueva introducida con C ++ 14?


No se agregarán nuevas palabras clave con C ++ 14. Esto no es sorprendente ya que C ++ 14 está pensado como una pequeña actualización de C ++ 11, principalmente involucrado en la limpieza de errores y en la realización de pequeñas mejoras de bajo impacto. Es probable que el siguiente cambio importante sea C ++ ''17'', donde esperaría nuevas palabras clave una vez más.

El Comité de estándares de C ++ tiende a evitar agregar nuevas palabras clave al lenguaje, pero con C ++ 11 ese no era el caso.

Creo que vale la pena considerar por qué el comité se abstiene de agregar nuevas palabras clave (y, por coincidencia, por qué se equivoca al incluir el auto en su lista). El principal problema con las nuevas palabras clave es que en C ++ no se puede usar una palabra clave como identificador, lo que significa que al agregar una nueva palabra clave se rompe el código existente. La reutilización auto , entonces, no rompe su regla porque ningún código existente podría usar auto como identificador de todos modos .

Por lo tanto, para aceptar una nueva palabra clave, debe existir una justificación que supere el costo de una potencial discrepancia con el código existente y ninguna forma sensata de implementar lo mismo sin una nueva palabra clave. En el caso de C ++ 11, el comité aceptó algunas propuestas que requerían nuevas palabras clave, ya que consideraban que el beneficio superaba el costo, no porque no odiaran agregar palabras clave nuevas.

También es la razón por la cual, si miras hacia abajo en la lista que has proporcionado, cada una es una palabra clave compuesta, ya que reduce la posibilidad de que choquen con los identificadores existentes.


Tabla 4 (Palabras clave) en N3936 (C ++ 14):

alignas continue friend register true alignof decltype goto reinterpret_cast try asm default if return typedef auto delete inline short typeid bool do int signed typename break double long sizeof union case dynamic_cast mutable static unsigned catch else namespace static_assert using char enum new static_cast virtual char16_t explicit noexcept struct void char32_t export nullptr switch volatile class extern operator template wchar_t const false private this while constexpr float protected thread_local const_cast for public throw

Tabla 4 en N3337 (C ++ 11):

alignas continue friend register true alignof decltype goto reinterpret_cast try asm default if return typedef auto delete inline short typeid bool do int signed typename break double long sizeof union case dynamic_cast mutable static unsigned catch else namespace static_assert using char enum new static_cast virtual char16_t explicit noexcept struct void char32_t export nullptr switch volatile class extern operator template wchar_t const false private this while constexpr float protected thread_local const_cast for public throw

... que es una manera larga de decir "no".

( override y final son "identificadores con significado especial" y se enumeran en la Tabla 3, and etc. son "representaciones alternativas ... para ciertos operadores y puntuadores" y se enumeran en la Tabla 5. Ninguna tabla cambió entre C ++ 11 y C ++ 14)