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?
dedução de argumento de modelo para modelos de classe
[*this]{ std::cout << could << " be " << useful << '\n'; }
[[fallthrough]]
, [[nodiscard]]
, [[maybe_unused]]
atributos
using
nos atributos para evitar ter que repetir um namespace de atributo.
Compiladores agora são obrigados a ignorar atributos não padrão que eles não reconhecem .
Simples static_assert(expression);
sem string
não throw
a menos throw()
e throw()
é noexcept(true)
.
std::tie
de primeira classe com auto
name__const auto [it, inserted] = map.insert( {"foo", bar} );
it
e inserted
com tipo deduzido do pair
que map::insert
retorna.std::array
s e estruturas relativamente planasif (init; condition)
E switch (init; condition)
if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
if(decl)
para casos em que decl
não é convertible-to-bool sensatamente.Generalizando os loops baseados em intervalo
Ordem de avaliação fixa para (algumas) expressões com alguma modificações
.then
no trabalho futuro.Garantias de progresso para frente (FPG) (também, FPGs para algoritmos paralelos )
u8'U', u8'T', u8'F', u8'8'
literais de caracteres (a string já existia)
construtores herdados correções para alguns casos de canto (veja P0136R para exemplos de mudanças de comportamento)
std::string
como matriz de referência para caractere ou substringstring const&
novamente. Também pode fazer a análise um bajillion vezes mais rápido."hello world"sv
char_traits
std::byte
fora mais do que eles poderiam mastigar.
std::invoke
std::apply
std::make_from_Tuple
, std::apply
aplicado à construção de objetos
is_invocable
, is_invocable_r
, invoke_result
result_of
is_invocable<Foo(Args...), R>
é "você pode chamar Foo
com Args...
e obter algo compatível com R
name__", onde R=void
é o padrão.invoke_result<Foo, Args...>
é std::result_of_t<Foo(Args...)>
mas aparentemente menos confuso?[class.directory_iterator]
e [class.recursive_directory_iterator]
fstream
name__s pode ser aberto com path
name__s, assim como com const path::value_type*
strings.
for_each_n
reduce
name__
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
atomic<T>
::is_always_lockfree
std::lock
ao bloquear mais de uma exclusão mútua de cada vez.std
e máquinas relacionadas[func.searchers]
e [alg.search]
std::function
para alocadoresstd::sample
, amostragem de um intervalo?
try_emplace
e insert_or_assign
Splicing para map<>
, unordered_map<>
, set<>
e unordered_set<>
non-const .data()
para string.
não membro std::size
, std::empty
, std::data
std::begin
/end
name__A família de funções emplace
agora retorna uma referência ao objeto criado .
unique_ptr<T[]>
corrige e outros unique_ptr
ajustes.weak_from_this
e alguns corrigidos para compartilhado a partir destestd
name__:{}
construção de std::Tuple
e outras melhoriasC + + 17 biblioteca é baseada em C11 em vez de C99
std[0-9]+
reservado para futuras bibliotecas padrão
std
expostasstd::clamp()
std::clamp( a, b, c ) == std::max( b, std::min( a, c ) )
aproximadamentegcd
NAME__ E lcm
NAME _std::uncaught_exceptions
std::as_const
std::bool_constant
_v
std::void_t<T>
std::owner_less<void>
std::less<void>
, mas para os ponteiros inteligentes classificarem com base no conteúdostd::chrono
polishstd::conjunction
, std::disjunction
, std::negation
expostostd::not_fn
std
name __std::less
.<codecvt>
memory_order_consume
result_of
, substituído por invoke_result
shared_ptr::unique
, não é muito thread-safeIsocpp.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++:
register
NAME _ , palavra-chave reservada para uso futurobool b; ++b;
<functional>
stuff, random_shuffle
std::function
Houve reescritos. Não tenho certeza se eles têm algum impacto no código ou se são apenas limpezas no padrão:
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?)
https://isocpp.org/files/papers/p0636r0.html