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)