C ++ 17 - C++17

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_shufflee adaptadores função antiga. Estes foram substituídos em C ++ 11 por instalações melhoradas, tais como std::unique_ptr, std::shuffle, std::bind, e lambdas.
  • Remoção do uso (anteriormente obsoleto) da palavra-chave registercomo 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_assertopcional
  • Permitir typename(como alternativa a class) em um parâmetro de modelo de modelo
  • Novas regras para autodedução de lista de inicialização com suporte
  • Definições de namespace aninhado, por exemplo, em vez denamespace X::Y { }namespace X { namespace Y { } }
  • Permitindo atributos para namespaces e enumeradores
  • Novos atributos padrão , e[[fallthrough]][[maybe_unused]][[nodiscard]]
  • u8Literais 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 autocomo 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 ifcom o formulárioif constexpr(expression)
  • Declarações de vinculação estruturadas, permitindo auto [a, b] = getTwoReturnValues();
  • Inicializadores em instruções ifeswitch
  • a inicialização de cópia e a inicialização direta de objetos do tipo a Tpartir de expressões prvalue do tipo T(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 __cplusplusalterado 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 de std::uncaught_exceptionno tratamento de exceções
  • Novas funções de inserção try_emplacee insert_or_assignpara std::mape std::unordered_map estruturas de dados de chave de valor associativo
  • Uniforme recipiente de acesso: std::size, std::emptyestd::data
  • Definição de " iteradores contíguos "
  • Uma biblioteca de sistema de arquivos baseada emboost::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::disjunctionestd::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.

Veja também

Referências