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



linguagem c11 (1)

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 suporta "C ++ 1z", quais desses recursos estarão disponíveis quando o compilador for atualizado para o C ++ 17?


Caracteristicas do idioma:

Modelos e código genérico

Lambda

Atributos

Limpeza de sintaxe

Controle multi-retorno e fluxo mais limpo

  • Ligações estruturadas

    • Basicamente, std::tie primeira classe com auto
    • Exemplo:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • Cria variáveis ​​e são inserted com tipo deduzido do pair que map::insert retorna.
    • Funciona com tuplas / curtidas de pares e std::array estruturas relativamente planas
    • 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 o if(decl) aos casos em que decl não é convertível em bool de maneira sensata.
  • Generalizando baseado em intervalo para loops

    • Parece ser principalmente o 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

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) std::apply não cobertos acima ou abaixo

Melhorias em contêineres

Alterações inteligentes do ponteiro

Outras melhorias no tipo de dados std :

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 .

A lista de recursos do clang e a lista de recursos da library serão as próximas a serem pilhadas. Isso não parece confiável, pois é C ++ 1z, não C ++ 17.

esses slides tinham alguns recursos ausentes em outros lugares.

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 (alterações em 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 do ponteiro compartilhado e alterações exclusivas?)

Alterações nas especificações:

Referência adicional:





c++17