Quais são os novos recursos do C ++ 17?

1007

O C ++ 17 agora está completo, portanto é improvável que ocorram grandes alterações. Centenas de propostas foram apresentadas para o C ++ 17.

Quais desses recursos foram adicionados ao C ++ no C ++ 17?

Ao usar um compilador C ++ que suporte "C ++ 1z", quais desses recursos estarão disponíveis quando o compilador for atualizado para o C ++ 17?

Yakk - Adam Nevraumont
fonte
26
Lista completa de recursos de acordo com Clang: biblioteca , idioma principal .
31516 Kerrek SB
3
este blog bost tem um resumo resumido: bfilipek.com/2017/01/cpp17features.html
atb
13
Consulte o documento Alterações oficiais entre C ++ 14 e C ++ 17 DIS (P0636r0) para obter uma lista das principais alterações de C ++ 14 para C ++ 17.
jotik
1
@RaghavNavada Great! A seção C ++ 20 está sendo mantida? Há # 53 , mas ele está fechado ...
LF
Tudo neste site en.cppreference.com/w/cpp está marcado com a versão necessária.
jw_

Respostas:

1266

Características da linguagem:

Modelos e código genérico

Lambda

Atributos

Limpeza de sintaxe

Controle multi-retorno e fluxo mais limpo

  • Ligações estruturadas

    • Basicamente, de primeira classe std::tiecomauto
    • Exemplo:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • Cria variáveis ite insertedcom tipo deduzido do pairque map::insertretorna.
    • Funciona com tuplas / curtidas e std::arraycombinações relativamente simples
    • Ligações estruturadas realmente nomeadas no padrão
  • if (init; condition) e switch (init; condition)

    • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
    • Estende os if(decl)casos em que declnão é sensivelmente conversível em bool.
  • Generalizando baseado em intervalo para loops

    • Parece ser principalmente suporte para sentinelas ou iteradores finais que não são do mesmo tipo que os iteradores iniciais, o que ajuda com loops com terminação nula e similares.
  • se constexpr

    • Muito requisitado recurso para simplificar código quase genérico.

Diversos

Adições à biblioteca:

Tipos de dados

  • std::variant<Ts...>

    • Quase sempre não está vazio da última vez que verifiquei?
    • Tipo de união marcado
    • {awesome | útil}
  • std::optional

    • Talvez tenha um de algo
    • Ridiculamente útil
  • std::any

    • Contém um dos itens (que podem ser copiados)
  • std::string_view

    • std::string como referência a matriz de caracteres ou substring
    • Nunca tome de string const&novo. Também pode tornar a análise um bajilhão de vezes mais rápida.
    • "hello world"sv
    • constexpr char_traits
  • std::byte mais do que podiam mastigar.

    • Nem um número inteiro nem um caractere, apenas dados

Invocar coisas

Sistema de arquivos TS v1

Novos algoritmos

  • for_each_n

  • reduce

  • transform_reduce

  • exclusive_scan

  • inclusive_scan

  • transform_exclusive_scan

  • transform_inclusive_scan

  • Adicionado para fins de segmentação, exposto mesmo se você não os estiver usando

Rosqueamento

(partes de) Fundamentos da biblioteca TS v1 não cobertos acima ou abaixo

Melhorias em contêineres

Alterações inteligentes do ponteiro

Outras stdmelhorias no tipo de dados:

Diversos

Traits

Descontinuada

O Isocpp.org possui uma lista independente de alterações desde o C ++ 14; foi parcialmente saqueado.

Naturalmente, o trabalho com TS continua em paralelo; portanto, existem alguns TS que ainda não estão maduros e terão que esperar pela próxima iteração. O destino para a próxima iteração é C ++ 20, conforme planejado anteriormente, não C ++ 19, como alguns rumores implicavam. C ++ 1O foi evitado.

Lista inicial retirada deste post do reddit e deste post do reddit , com links adicionados via googling ou na página isocpp.org acima.

Entradas adicionais saqueadas da lista de teste de recursos do SD-6 .

lista de recursos do clang e lista de recurso de biblioteca estão ao lado de ser saqueada. Isso não parece confiável, pois é C ++ 1z, não C ++ 17.

esses slides tinham alguns recursos ausentes em outro lugar.

Embora "o que foi removido" não tenha sido solicitado, aqui está uma pequena lista de algumas coisas ((principalmente?) Anteriores descontinuadas) que foram removidas no C ++ 17 do C ++:

Removido:

Houve reformulações. Não tenho certeza se isso tem algum impacto no código ou se são apenas limpezas no padrão:

Artigos ainda não integrados acima:

  • P0505R0 (cronógrafo constexpr)

  • P0418R2 (ajustes atômicos)

  • P0512R0 (ajustes na dedução do argumento do modelo)

  • P0490R0 (ajustes de ligação estruturados)

  • P0513R0 (muda para std::hash)

  • P0502R0 (exceções paralelas)

  • P0509R1 (atualizando restrições no tratamento de exceções)

  • P0012R1 (faça com que as especificações de exceção façam parte do sistema de tipos)

  • P0510R0 (restrições sobre variantes)

  • P0504R0 (tags para opcional / variante / qualquer)

  • P0497R0 (ajustes de ptr compartilhados)

  • P0508R0 (identificadores de nó de ligações estruturadas)

  • P0521R0 (contagem de uso de ponteiro compartilhado e alterações exclusivas?)

Alterações nas especificações:

Referência adicional:

Yakk - Adam Nevraumont
fonte
2
Hum, memory_order_consumenão parece ser oficialmente reprovado. É apenas desencorajado na nota. Talvez faça sentido mencionar isso (com um parêntese à direita, por exemplo)?
LF