Quais são os novos resources 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 resources foram adicionados ao C ++ em C ++ 17?

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

Caracteristicas do idioma:

Modelos e código genérico

  • Dedução de argumento de modelo para modelos de class

  • template

    • Representa um valor de qualquer tipo (argumento de modelo sem tipo).
  • Correções de argumentos de modelo não tipificados

  • templatetypename bob> struct foo {}

  • (Folding + … + expressões) e revisões

  • auto x{8}; é um int

  • modernizando using com ... e listas

Lambda

  • constexpr lambdas

    • Lambdas são implicitamente constexpr se eles se qualificam
  • Capturando *this em lambdas

    • [*this]{ std::cout << could << " be " << useful << '\n'; }

Atributos

  • [[fallthrough]] , [[nodiscard]] , [[maybe_unused]]

  • [[attributes]] em namespace s e enum { erator[[s]] }

  • using em atributos para evitar ter que repetir um namespace de atributo.

  • Os compiladores agora precisam ignorar atributos não padrão que não reconhecem .

    • A formulação do C ++ 14 permitia que os compiladores rejeitassem atributos com escopo desconhecido.

Limpeza de syntax

  • Variáveis ​​inline

    • Como funções inline
    • Compilador escolhe onde a instância é instanciada
    • Deprecate redeclaration constexpr static , agora implicitamente inline.
  • namespace A::B

  • static_assert(expression); simples static_assert(expression); sem corda

  • no throw menos que throw() e throw() seja noexcept(true) .

Multi-retorno mais limpo e controle de stream

  • Ligações estruturadas

    • Basicamente, std::tie primeira class com auto
    • Exemplo:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • Cria variables ​​e inserted com o tipo deduzido do pair que map::insert retorna.
    • Funciona com estruturas de tupla / par e std::array e estruturas relativamente planas
    • Nomeado atualmente 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 os casos em que decl não é convertible-to-bool sensatamente.
  • Generalização de loops baseados em intervalo

    • Parece ser, na maioria das vezes, suporte a sentinelas ou fim a iteradores que não são do mesmo tipo que os iteradores iniciados, o que ajuda com os loops com terminação nula e similares.
  • se constexpr

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

Misc

  • Literais de ponto flutuante hexadecimal

  • Alocação de memory dinâmica para dados super alinhados

  • Elisão de cópia garantida

    • Finalmente!
    • Não em todos os casos, mas distingue a syntax onde você está "apenas criando algo" que foi chamado de elisão, de "elisão genuína".
  • Corrigido ordem de avaliação para (algumas) expressões com algumas modificações

    • Não incluindo argumentos de function, mas intercalação de avaliação de argumento de function agora proibida
    • Faz com que um monte de códigos quebrados funcione principalmente e, em .then , .then trabalhos futuros.
  • Inicialização de lista direta de enums

  • Garantias de progresso para frente (FPG) (também, FPGs para algoritmos paralelos )

    • Eu acho que isso está dizendo "a implementação não pode parar os threads para sempre"?
  • u8'U', u8'T', u8'F', u8'8' (string já existia)

  • "noexcept" no sistema de tipos

  • __has_include

    • Teste se um arquivo de header include seria um erro
    • faz com que a migration de experimental para std seja quase perfeita
  • Arrays de correções de conversão de ponteiro

  • construtores herdados corrigidos em alguns casos de canto (veja P0136R0 para exemplos de mudanças de comportamento)

  • boot agregada com inheritance .

  • std::launder , tipo pune, etc

Adições de biblioteca:

Tipos de dados

  • std::variant

    • 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 referência a array de caracteres ou substring
    • Nunca leve uma string const& novamente. Também pode fazer a análise um bajillion vezes mais rápido.
    • "hello world"sv
    • constexpr char_traits
  • std::byte off mais do que eles poderiam mastigar.

    • Nem um inteiro nem um caractere, apenas dados

Invocar coisas

Sistema de arquivos TS v1

  • [class.path]

  • [class.filesystem.error]

  • [class.file_status]

  • [class.directory_entry]

  • [class.directory_iterator] e [class.recursive_directory_iterator]

  • [fs.ops.funcs]

  • fstream s pode ser aberto com o path s, assim como com const path::value_type* strings.

Novos algoritmos

  • for_each_n

  • reduce

  • 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

  • std::shared_mutex

    • De duração indeterminada, que pode ser mais eficiente se você não precisar.
  • atomic ::is_always_lockfree

  • scoped_lock

    • Salva alguma dor std::lock ao bloquear mais de um mutex por vez.
  • Paralelismo TS v1

    • O documento vinculado de 2014 pode estar desatualizado
    • Versões paralelas de algoritmos std e máquinas relacionadas
  • hardware _ * _ interference_size

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

Melhorias no Contêiner

  • try_emplace e insert_or_assign

    • dá melhores garantias em alguns casos onde movimento / cópia espúria seria ruim
  • Splicing for map<> , unordered_map<> , set<> e unordered_set<>

    • Mova os nós entre os contêineres de forma barata.
    • Mesclar contêineres inteiros de forma barata.
  • non-const .data() para string.

  • não membro std::size , std::empty , std::data

    • como std::begin / end
  • Suporte de tipo incompleto mínimo em contêineres

  • Iterador contíguo "conceito"

  • iteradores constexpr

  • A família de funções emplace agora retorna uma referência ao object criado .

Mudanças inteligentes de ponteiro

  • correções unique_ptr e outros ajustes unique_ptr .
  • weak_from_this e alguns corrigidos para compartilhar com isso

Outras melhorias de tipo de dados std :

  • {} construção de std::tuple e outras melhorias
  • TriviallyCopyable reference_wrapper , pode ser um aumento de desempenho

Misc

  • C + + 17 biblioteca é baseada em C11 em vez de C99

  • std[0-9]+ reservado para futuras bibliotecas padrão

  • destroy(_at|_n) , uninitialized_move(_n) , uninitialized_value_construct(_n) , uninitialized_default_construct(_n)

    • código de utilidade já na maioria das implementações std expostos
  • Funções matemáticas especiais
    • os cientistas podem gostar deles
  • std::clamp()
    • std::clamp( a, b, c ) == std::max( b, std::min( a, c ) ) aproximadamente
  • gcd e lcm
  • std::uncaught_exceptions
    • Necessário se você quiser jogar somente se estiver protegido contra destruidores
  • std::as_const
  • std::bool_constant
  • Um monte de variables ​​de modelo _v
  • std::void_t
    • Surpreendentemente útil ao escrever modelos
  • std::owner_less
    • como std::less , mas para pointers inteligentes para classificar com base no conteúdo
  • std::chrono polonês
  • std::conjunction , std::disjunction , std::negation exposta
  • std::not_fn
  • Regras para noexcept dentro std
  • std :: is_contiguous_layout , útil para hashing eficiente
  • std :: to_chars / std :: from_chars , alto desempenho, conversão de número agnóstico de localidade; finalmente, uma maneira de serializar / desserializar para formatos legíveis por humanos (JSON & co)
  • std :: default_order , indirection sobre std::less . ( quebra a ABI de alguns compiladores devido ao nome mangling, removido.)

Traços

  • troca
  • is_aggregate
  • has_unique_object_representations

Descontinuada

  • Algumas bibliotecas C
  • memory_order_consume
  • result_of , substituído por invoke_result
  • shared_ptr::unique , não é muito thread-safe

Isocpp.org tem uma lista independente de mudanças desde o C ++ 14; foi parcialmente saqueado.

Naturalmente, o trabalho 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 desta postagem do reddit e desta postagem do reddit , com links adicionados via googling ou da página isocpp.org acima.

Entradas adicionais saqueadas da lista de testes de resources do SD-6 .

A lista de resources do clang e a lista de resources da biblioteca estão próximos. Isso não parece ser confiável, já que é C ++ 1z, não C ++ 17.

esses slides tinham alguns resources faltando em outros lugares.

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

Removido:

  • register , palavra-chave reservada para uso futuro
  • bool b; ++b;
  • trigramas
    • se você ainda precisar deles, eles agora fazem parte da codificação do arquivo de origem, não fazem parte do idioma
  • aliases do ios
  • auto_ptr, material antigo, random_shuffle
  • alocadores em std::function

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

Trabalhos ainda não integrados:

  • P0505R0 (constexpr chrono)

  • P0418R2 (ajustes atômicos)

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

  • P0490R0 (ajustes de binding estruturados)

  • P0513R0 (muda para std::hash )

  • P0502R0 (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)

  • P0510R0 (restrições às variantes)

  • P0504R0 (tags para opcional / variante / qualquer)

  • P0497R0 (ajustes ptr compartilhados)

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

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

Alterações de especificação:

  • especificações de exceção e expressões de lançamento

Referência adicional: