O C ++ 14 está adicionando novas palavras-chave ao C ++?

103

O Comitê de Padrões C ++ tende a se esquivar de adicionar novas palavras-chave à linguagem, mas com C ++ 11 esse não era o caso. Alguns exemplos:

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

Há alguma nova palavra-chave introduzida no C ++ 14?

Nikos Athanasiou
fonte

Respostas:

135

Tabela 4 (palavras-chave) em 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

Tabela 4 em 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 é uma maneira prolixa de dizer "não".

( overridee finalsão "identificadores com significado especial" e estão listados na Tabela 3; andetc. são "representações alternativas ... para certos operadores e pontuadores" e estão listados na Tabela 5. Nenhuma das tabelas mudou entre C ++ 11 e C ++ 14.)

TC
fonte
2
Eu diria que é porque eles são colocados no namespace global de cada unidade de tradução. (Sim, você pode perguntar por que isso, e então bem ...)
R. Martinho Fernandes
2
A registerpalavra - chave ainda é útil ou usada no novo código C ++ 11?
Walter
2
@Walter Está obsoleto e amplamente ignorado pelos compiladores.
TC de
1
Os tokens alternativos para operadores lógicos não são mencionados nessas tabelas? Não são palavras-chave C ++?
Nikos Athanasiou
1
@NikosAthanasiou, Há uma mesa para aqueles logo abaixo deste IIRC.
Chris
85

Estou postando esta resposta com o objetivo de fornecer ferramentas para encontrar respostas para perguntas semelhantes.

O rascunho padrão atualmente é mantido em um repositório público do GitHub. Isso significa que você pode fazer essa pergunta ao próprio GitHub!

A tabela de palavras-chave está no arquivo source/lex.tex. Se você colocar a culpa nisso, podemos descobrir que a última mudança na tabela de palavras-chave ocorreu em agosto de 2011 (na verdade é o primeiro commit: essa tabela não mudou desde que o repo foi ao ar na época do C ++ 11 estava sendo finalizado).

Como alternativa, podemos pedir ao GitHub para comparar os dois rascunhos que foram enviados para votação para as duas versões do padrão: N3337 e N3936. Uma diferença entre os dois mostra que as alterações para lex.texnão alteraram nada na tabela de palavras-chave.

R. Martinho Fernandes
fonte
1
Obrigado por isso! Parece que ainda não houve mudanças até hoje.
sbi
34

Nenhuma nova palavra-chave será adicionada com C ++ 14. Isso não é surpreendente, pois o C ++ 14 pretende ser uma pequena atualização para o C ++ 11, principalmente envolvida na limpeza de bugs e em pequenas melhorias de baixo impacto. A próxima grande mudança provavelmente será C ++ '17', onde eu esperaria novas palavras-chave mais uma vez.

O Comitê de Padrões C ++ tende a se esquivar de adicionar novas palavras-chave à linguagem, mas com C ++ 11 esse não era o caso.

Acho que vale a pena considerar por que o comitê evita adicionar novas palavras-chave (e, coincidentemente, por que você está errado em incluir autoem sua lista). O principal problema com as novas palavras-chave é que em C ++ você não pode usar uma palavra-chave como identificador, o que significa que adicionar uma nova palavra-chave quebra o código existente. A reaproveitamento auto, então, não quebra sua regra porque nenhum código existente poderia ser usado autocomo um identificador de qualquer maneira .

Portanto, para aceitar uma nova palavra-chave, é necessário haver uma justificativa que supere o custo de um conflito potencial com o código existente e nenhuma maneira sensata de implementar a mesma coisa sem uma nova palavra-chave. No caso do C ++ 11, o comitê aceitou algumas propostas que exigiam novas palavras-chave, pois eles sentiram que o benefício superava o custo, não porque não detestassem adicionar novas palavras-chave.

É também por isso que, se você olhar a lista fornecida, verá que cada uma é uma palavra-chave composta, pois isso reduz a chance de que elas entrem em conflito com os identificadores existentes.

Jack Aidley
fonte
1
"C ++ '17' onde eu esperaria novas palavras-chave mais uma vez.": O C ++ acabará por parar de crescer?
Giorgio
2
@Giorgio O software e o hardware irão parar de evoluir? O grande dilema aqui é se você pode tomar uma decisão ousada e jogar fora a sintaxe "antiga", quebrar o código antigo e prosseguir apenas com a parte evoluída da linguagem. Python meio que tenta fazer isso
Lorah Attkins
2
@NorahAttkins: É claro que o software deve evoluir, mas crescer uma linguagem indefinidamente não é a única solução: quando uma linguagem está madura para um determinado nicho, você sempre pode quebrar a compatibilidade e começar uma nova linguagem para satisfazer as necessidades de novos nichos. Python é um exemplo. Outros exemplos são C ++ -> Java, Java -> Scala, Common Lisp -> Clojure, C ++ -> D. Algumas linguagens crescem indefinidamente porque sua comunidade está convencida de que sua linguagem favorita é a única linguagem verdadeira e eles a querem para ser adequado para todas as áreas de aplicação possíveis. Claro, essa expectativa não é realista.
Giorgio