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?
Respostas:
Características da linguagem:
Modelos e código genérico
Dedução de argumento de modelo para modelos de classe
template <auto>
Correções de argumentos de modelo não-tipo
template<template<class...>typename bob> struct foo {}
(Dobrando + ... + expressões) e Revisões
auto x{8};
é umint
modernizando
using
com...
e listasLambda
constexpr lambdas
Capturando
*this
em lambdas[*this]{ std::cout << could << " be " << useful << '\n'; }
Atributos
[[fallthrough]]
,[[nodiscard]]
,[[maybe_unused]]
Atributos[[attributes]]
nonamespace
s eenum { erator[[s]] }
using
em atributos para evitar a repetição de um espaço para nome de atributo.Compiladores agora são obrigados a ignorar atributos não-padrão que eles não reconhecem .
Limpeza de sintaxe
Variáveis em linha
namespace A::B
Simples
static_assert(expression);
sem cordanão
throw
throw()
, a menos ethrow()
sejanoexcept(true)
.Controle multi-retorno e fluxo mais limpo
Ligações estruturadas
std::tie
comauto
const auto [it, inserted] = map.insert( {"foo", bar} );
it
einserted
com tipo deduzido dopair
quemap::insert
retorna.std::array
combinações relativamente simplesif (init; condition)
eswitch (init; condition)
if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
if(decl)
casos em quedecl
não é sensivelmente conversível em bool.Generalizando baseado em intervalo para loops
se constexpr
Diversos
Literais de ponto flutuante hexadecimal
Alocação dinâmica de memória para dados superalinhados
Garantia de cópia garantida
Ordem de avaliação corrigida para (algumas) expressões com algumas modificações
.then
trabalhos futuros.Inicialização direta da lista de enumerações
Garantias de progresso progressivo (FPG) (também, FPGs para algoritmos paralelos )
u8'U', u8'T', u8'F', u8'8'
literais de caracteres (a string já existia)"noexcept" no sistema de tipos
__has_include
Matrizes de correções de conversão de ponteiro
construtores herdados corrigem alguns casos de canto (consulte P0136R0 para exemplos de mudanças de comportamento)
inicialização agregada com herança .
std::launder
, digite punição, etcAdições à biblioteca:
Tipos de dados
std::variant<Ts...>
std::optional
std::any
std::string_view
std::string
como referência a matriz de caracteres ou substringstring const&
novo. Também pode tornar a análise um bajilhão de vezes mais rápida."hello world"sv
char_traits
std::byte
mais do que podiam mastigar.Invocar coisas
std::invoke
std::apply
std::make_from_tuple
,std::apply
aplicado à construção do objetois_invocable
,is_invocable_r
,invoke_result
result_of
is_invocable<Foo(Args...), R>
é "você pode chamarFoo
comArgs...
e obter algo compatível comR
", ondeR=void
é padrão.invoke_result<Foo, Args...>
éstd::result_of_t<Foo(Args...)>
aparentemente aparentemente menos confuso?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 compath
s, assim como comconst 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, exposto mesmo se você não os estiver usando
Rosqueamento
std::shared_mutex
atomic<T>
::is_always_lockfree
scoped_lock<Mutexes...>
std::lock
dor ao bloquear mais de um mutex por vez.Paralelismo TS v1
std
algoritmos e máquinas relacionadashardware _ * _ interference_size
(partes de) Fundamentos da biblioteca TS v1 não cobertos acima ou abaixo
[func.searchers]
e[alg.search]
[pmr]
std::function
para alocadoresstd::sample
, amostragem de um intervalo?Melhorias em contêineres
try_emplace
einsert_or_assign
Splicing para
map<>
,unordered_map<>
,set<>
eunordered_set<>
não-const
.data()
para string.terceiro
std::size
,std::empty
,std::data
std::begin
/end
Suporte mínimo de tipo incompleto em contêineres
Iterador contíguo "conceito"
constexpr
iteradoresA
emplace
família de funções agora retorna uma referência ao objeto criado .Alterações inteligentes do ponteiro
unique_ptr<T[]>
correções e outrosunique_ptr
ajustes.weak_from_this
e alguns corrigidos para compartilhados a partir desteOutras
std
melhorias no tipo de dados:{}
construçãostd::tuple
e outras melhoriasDiversos
A biblioteca C ++ 17 é baseada em C11 em vez de C99
Reservado
std[0-9]+
para futuras bibliotecas padrãodestroy(_at|_n)
,uninitialized_move(_n)
,uninitialized_value_construct(_n)
,uninitialized_default_construct(_n)
std
implementações expostasstd::clamp()
std::clamp( a, b, c ) == std::max( b, std::min( a, c ) )
aproximadamentegcd
elcm
std::uncaught_exceptions
std::as_const
std::bool_constant
_v
variáveis de modelostd::void_t<T>
std::owner_less<void>
std::less<void>
, mas para que ponteiros inteligentes classifiquem com base no conteúdostd::chrono
polonêsstd::conjunction
,std::disjunction
,std::negation
Expostastd::not_fn
std
std :: default_order , indireto sobre( quebra a ABI de alguns compiladores devido ao nome incorreto, removido.)std::less
.Traits
Descontinuada
<codecvt>
memory_order_consume
result_of
, substituído porinvoke_result
shared_ptr::unique
, não é muito seguroO 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:
register
, palavra-chave reservada para uso futurobool b; ++b;
<functional>
coisas antigas ,random_shuffle
std::function
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:
papéis agrupados por ano; nem todos aceitos
https://isocpp.org/files/papers/p0636r0.html
fonte
memory_order_consume
não parece ser oficialmente reprovado. É apenas desencorajado na nota. Talvez faça sentido mencionar isso (com um parêntese à direita, por exemplo)?