web-dev-qa-db-pt.com

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

O C++ 17 agora está completo, portanto, é improvável que ocorram grandes mudanças. Foram apresentadas centenas de propostas para o C++ 17.

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

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

954
Yakk - Adam Nevraumont

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, std::tie de primeira classe com autoname__
    • Exemplo:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • Cria variáveis ​​ite insertedcom tipo deduzido do pairque map::insert retorna.
    • Funciona com Tuple/par-gostos e std::arrays e estruturas relativamente planas
    • Na verdade, chamado ligações estruturadas no padrão
  • if (init; condition) E switch (init; condition)

    • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
    • Estende o if(decl) para casos em que declnão é convertible-to-bool sensatamente.
  • Generalizando os loops baseados em intervalo

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

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

Misc

Adições de biblioteca:

Tipos de dados

  • std::variant<Ts...>

    • Quase sempre não vazio pela última vez que verifiquei?
    • Tagged union type
    • {awesome | útil}
  • std::optional

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

    • Detém um de qualquer coisa (que é copiável)
  • std::string_view

    • std::string como matriz de referência para caractere ou substring
    • Nunca tome um string const& novamente. Também pode fazer a análise um bajillion vezes mais rápido.
    • "hello world"sv
    • constexpr char_traits
  • std::byte fora mais do que eles poderiam mastigar.

    • Nem um inteiro nem um caractere, apenas dados

Invocar coisas

Sistema de arquivos TS v1

Novos algoritmos

  • for_each_n

  • reducename__

  • transform_reduce

  • exclusive_scan

  • inclusive_scan

  • transform_exclusive_scan

  • transform_inclusive_scan

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

Threading

(partes de) Library Fundamentals TS v1 não coberto acima ou abaixo

Melhorias no Contêiner

Mudanças de ponteiro inteligentes

Outras melhorias do tipo de dados stdname__:

Misc

Traços

Descontinuada

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

Naturalmente, o trabalho em TS continua em paralelo, então existem alguns TS que não estão bem maduros e que terão que esperar pela próxima iteração. O alvo para a próxima iteração é o C++ 20 como planejado anteriormente, e não o C++ 19 como alguns rumores implicaram. C++ 1O foi evitado.

Lista inicial tirada de este post do reddit e este post do reddit , com links adicionados via googling ou da página isocpp.org acima.

Entradas adicionais saqueadas de SD-6 lista de testes de recursos.

lista de recursos do clang e lista de recursos da biblioteca estão próximos de serem pilhados. Isso não parece ser confiável, pois é C++ 1z, não C++ 17.

esses slides tinha alguns recursos faltando em outro lugar.

Enquanto "o que foi removido" não foi perguntado, aqui está uma pequena lista de algumas coisas ((principalmente?) Anteriores descontinuadas) que são removidas em C++ 17 do C++:

Removido:

Houve reescritos. Não tenho certeza se eles têm algum impacto no código ou se são apenas limpezas no padrão:

Trabalhos ainda não integrados:

  • P0505R (chromono constexpr)

  • P0418R2 (ajustes atômicos)

  • P0512R (ajustes de dedução de argumento de modelo)

  • P0490R (ajustes de ligação estruturada)

  • P0513R (muda para std::hash)

  • P0502R (exceções paralelas)

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

  • P0012R1 (faça especificações de exceção serem parte do sistema de tipos)

  • P0510R (restrições às variantes)

  • P0504R (tags para opcional/variante/qualquer)

  • P0497R (tweaks ptr compartilhados)

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

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

Alterações de especificação:

Referência adicional:

1215
Yakk - Adam Nevraumont