- O próximo padrão C++ na sequência do C++20
- Não é um divisor de águas como C++98, C++11 ou C++20, mas sim uma mudança pequena no nível do C++17
Entendendo as mudanças do padrão C++ (ao longo de 40 anos)
C++98
- No fim dos anos 80, Bjarne Stroustrup e Margaret A. Ellis escreveram o famoso livro Annotated C++ Reference Manual (ARM)
- Este livro tinha dois objetivos
- Como havia muitas implementações independentes de C++, o ARM definiu as funcionalidades de C++
- Serviu de base para o padrão C++98 (ISO/IEC 14882)
- O C++98 incluiu alguns recursos importantes
- Templates
- STL(Standard Template Library): incluindo contêineres, algoritmos, strings e IO Streams
C++03
- No C++03 (14882:2003), foram feitas correções técnicas muito pequenas
- Na comunidade, o C++03 junto com o C++98 é chamado de "C++ legado"
TR1
- Em 2005, aconteceu algo interessante. O TR1(Technical Report 1) foi publicado
- O TR1 foi um grande passo em direção ao C++11 e o primeiro passo rumo ao Modern C++
- Baseado no projeto Boost dos membros do comitê de padronização do C++
- Incluiu 13 bibliotecas que entrariam no padrão C++ da próxima geração (expressões regulares, números aleatórios, smart pointers como
std::shard_ptr, hash tables etc.)
C++11
- Foi o padrão C++ seguinte, mas nós o chamamos de Modern C++. Esse nome também inclui C++14 e C++17
- O C++11 mudou completamente a forma como desenvolvemos em C++
- Além dos componentes do TR1, trouxe move semantics, perfect forwarding, variadic templates, constexpr etc.
- Incluiu um modelo de memória baseado em threads e a API de Threading
C++14
- Um padrão C++ pequeno. Introduziu read-writer locks, lambdas generalizadas e funções constexpr
C++17
- Nem grande, nem pequeno
- Incluiu dois recursos excelentes: Parallel STL e sistema de arquivos padronizado
- Cerca de 80 algoritmos da STL podem ser executados por meio de políticas de execução (paralela, sequencial, vetorial)
- Foi bastante influenciado pelo Boost. Sistema de arquivos e três tipos de dados (
std::optional, std::variant, std::any)
C++20
- Assim como o C++11, o C++20 mudou a forma como programamos em C++
- Em especial, quatro grandes pontos
- Ranges: usando a biblioteca Ranges, é possível expressar algoritmos diretamente sobre contêineres e combiná-los com o operador pipe para aplicá-los a fluxos de dados infinitos
- Coroutines: fez a programação assíncrona em C++ se tornar algo principal. Serve de base para cooperação, event loops, fluxos de dados infinitos e pipelines
- Concepts: mudou a forma como pensamos e programamos templates. Permite impor restrições aos argumentos de template, fazer verificações de tipo etc., tudo verificável em tempo de compilação
- Modules: permite superar as limitações dos arquivos de cabeçalho. Promete várias coisas. Por exemplo, elimina a necessidade do pré-processador e, no fim, reduz o tempo de build e facilita a construção de pacotes
C++23
- Em julho de 2023, o C++23 estava prestes a passar pela votação final
- Adiciona o recurso pequeno, mas muito impactante para a própria linguagem, "Deducing this"
- De forma parecida com Python, é possível tornar explícito o ponteiro
this, que antes era passado implicitamente às funções-membro
- Com isso, técnicas complexas como CRTP(Curiously Recurring Template Pattern) ou a implementação do padrão Overload ficam mais simples
- A biblioteca do C++23 também tem adições importantes
- É possível importar diretamente a biblioteca padrão com
import std; ou aplicar format strings do C++20 em std:print e std:println
std::flat_map, que substitui std::map em termos de desempenho
- A interface de
std::optional foi expandida para uma interface monádica para melhorar a composabilidade
- O novo tipo de dado
std::expected
std::mdspan, um span multidimensional
std::generator, uma coroutine para gerar fluxos de números
2 comentários
Parece que ainda não há novidades sobre a padronização de networking, né?
Acho que até o próximo padrão também vai ser meio incerto, né;;