C ++ 17 - C++17
Revisões de linguagem C ++ |
---|
C ++ 17 é uma versão do padrão ISO / IEC 14882 para a linguagem de programação C ++ . O C ++ 17 substituiu a versão anterior do padrão C ++, chamado C ++ 14 , e mais tarde foi substituído pelo C ++ 20 .
História
Antes que o Comitê de Padrões C ++ fixasse um ciclo de lançamento de 3 anos, a data de lançamento do C ++ 17 era incerta. Naquele período, a revisão C ++ 17 também era chamada de C ++ 1z , seguindo C ++ 0x ou C ++ 1x para C ++ 11 e C ++ 1y para C ++ 14 . A especificação C ++ 17 atingiu o estágio de Draft International Standard (DIS) em março de 2017. Este DIS foi aprovado por unanimidade, com apenas comentários editoriais, e o padrão final foi publicado em dezembro de 2017. Poucas alterações foram feitas na C ++ Standard Template Library , embora alguns algoritmos no <algorithm>
cabeçalho receberam apoio para explícita paralelização e alguns sintáticas melhorias foram feitas.
Removido
Esta revisão do C ++ não apenas adicionou novos recursos, mas também removeu alguns.
- Remoção de trigrafos .
- Remoção de alguns obsoleto tipos e funções da biblioteca padrão , incluindo
std::auto_ptr
,std::random_shuffle
e adaptadores função antiga. Estes foram substituídos em C ++ 11 por instalações melhoradas, tais comostd::unique_ptr
,std::shuffle
,std::bind
, e lambdas. - Remoção do uso (anteriormente obsoleto) da palavra-chave
register
como um especificador de classe de armazenamento. Esta palavra-chave agora está reservada e não usada.
Novas características
C ++ 17 introduziu muitos novos recursos. As listas a seguir podem estar incompletas.
Língua
- Tornando a mensagem de texto
static_assert
opcional - Permitir
typename
(como alternativa aclass
) em um parâmetro de modelo de modelo - Novas regras para
auto
dedução de lista de inicialização com suporte - Definições de namespace aninhado, por exemplo, em vez de
namespace X::Y { … }
namespace X { namespace Y { … } }
- Permitindo atributos para namespaces e enumeradores
- Novos atributos padrão , e
[[fallthrough]]
[[maybe_unused]]
[[nodiscard]]
-
u8
Literais de caracteres UTF-8 ( ) ( literais de string UTF-8 existem desde C ++ 11 ; C ++ 17 adiciona os literais de caracteres correspondentes para consistência, embora como sejam restritos a um único byte, eles só podem armazenar " Latim básico " e códigos de controle C0 , ou seja, ASCII ) - Literais hexadecimais de ponto flutuante
- Uso de
auto
como o tipo para um parâmetro de modelo sem tipo - Avaliação constante para todos os argumentos de modelo não-tipo
- Expressões de dobra, para modelos variados
- Uma estática em tempo de compilação
if
com o formulárioif constexpr(expression)
- Declarações de vinculação estruturadas, permitindo
auto [a, b] = getTwoReturnValues();
- Inicializadores em instruções
if
eswitch
-
a inicialização de cópia e a inicialização direta de objetos do tipo a
T
partir de expressões prvalue do tipoT
(ignorando os qualificadores cv de nível superior) devem resultar em nenhuma cópia ou movimentação de construtores da expressão prvalue. Veja elisão de cópia para mais informações. - Algumas extensões na alocação de memória superalinhada
- Dedução do argumento do modelo de classe (CTAD), introduzindo guias de dedução do construtor, por exemplo. permitindo em vez de exigir tipos de argumentos de construtor explícitos ou uma função de modelo auxiliar adicional .
std::pair(5.0, false)
std::pair<double, bool>(5.0, false)
std::make_pair(5.0, false)
- Variáveis embutidas, que permitem a definição de variáveis em arquivos de cabeçalho sem violar a regra de definição . As regras são efetivamente as mesmas das funções inline
-
__has_include
, permitindo que a disponibilidade de um cabeçalho seja verificada por diretivas do pré-processador - Valor de
__cplusplus
alterado para201703L
- As especificações de exceção foram feitas parte do tipo de função
- Expressões lambda podem capturar "* isto" por valor
Biblioteca
- A maioria dos conceitos básicos da biblioteca TS I, incluindo:
-
std::string_view
, uma referência não proprietária somente leitura para uma sequência de caracteres ou segmento de string -
std::optional
, para representar objetos opcionais , um tipo de dados que nem sempre pode ser retornado por um determinado algoritmo com suporte para não retorno -
std::any
, para manter valores únicos de qualquer tipo
-
-
std::uncaught_exceptions
, como uma substituição destd::uncaught_exception
no tratamento de exceções - Novas funções de inserção
try_emplace
einsert_or_assign
parastd::map
estd::unordered_map
estruturas de dados de chave de valor associativo - Uniforme recipiente de acesso:
std::size
,std::empty
estd::data
- Definição de " iteradores contíguos "
- Uma biblioteca de sistema de arquivos baseada em
boost::filesystem
- Versões paralelas de algoritmos STL
- Funções matemáticas especiais adicionais , incluindo integrais elípticas e funções de Bessel
-
std::variant
, um contêiner de união marcado -
std::byte
, permitindo que char seja substituído por tipos de dados que pretendem modelar um byte de dados como um byte em vez de um caractere - Traços operador lógico:
std::conjunction
,std::disjunction
estd::negation
-
<memory_resource>
cabeçalho, para recursos de memória polimórfica
Suporte a compilador
- O GCC tem suporte completo para recursos da linguagem C ++ 17 desde a versão 8.
- O Clang 5 e versões posteriores implementam todos os recursos do C ++ 17.
- O Visual Studio 2017 15.8 (MSVC 19.15) oferece suporte a todo o C ++ 17.
Suporte de biblioteca
- libstdc ++ desde a versão 9.1 tem suporte completo para C ++ 17 (8.1 sem paralelismo TS e referindo-se a C99 em vez de C11)
- libc ++ a partir da versão 9 tem suporte parcial para C ++ 17, com o restante "em andamento"
- A Biblioteca Padrão MSVC desde 19.15 oferece suporte completo para C ++ 17, exceto para "Conversões de String Elementares" e referindo-se a C99 em vez de C11.