C ++ moderno = (mais) novo padrão



O termo "C ++ moderno" é frequentemente usado como sinônimo da expressão "código usando o novo padrão C ++". Aqui, "novo" pode significar qualquer coisa, de C ++ 11 a C ++ 17, ou mesmo o que já está disponível no C ++ 20. Eu acho que o C ++ moderno é algo mais, não limitado à adição do sinalizador -std = c ++ 17 .

O que significa moderno?


Se pesquisarmos o significado da palavra "moderno" na rede, um dos primeiros a encontrar uma definição do dicionário Merriam-Webster . Aqui estão duas partes relacionadas ao C ++:

[...]

2: envolvendo técnicas, métodos ou idéias recentes: métodos modernos de comunicação (atualizados)

3 em maiúsculas: de, relacionadas a ou com as características do período atual ou mais recente de desenvolvimento de um idioma - Inglês Moderno

[...]

Técnicas, métodos e idéias estão relacionados a mais do que apenas os novos recursos da linguagem. Freqüentemente, esses novos recursos suportam ou incluem novas técnicas, mas muitos deles já existem há algum tempo. Quanto às características do desenvolvimento da linguagem, elas se baseiam em como usamos a linguagem. Isso se refere à maneira como combinamos recursos antigos e novos, e isso é mais do que apenas um programa C ++ em funcionamento, ou algo incluído na biblioteca padrão.

Pode-se argumentar que os recursos existentes desde o C ++ 98 não fazem parte do C ++ moderno, porque existem há muito tempo. No entanto, é preciso lembrar que as pessoas mais ativas da comunidade que falam ou escrevem sobre "C ++ moderno" são mais frequentemente pioneiras. A maioria usa, estuda e até ensina o bom e velho "C com classes" dos anos 90, o que faz com que muitos dos métodos que não são usados ​​lá sejam parte do C ++ moderno.

Além dos novos recursos


Qual dos disponíveis no C ++ 98 considero pertencer à categoria de "C ++ moderno"? Aqui está uma lista parcial de alguns recursos e idéias importantes:

RAII


RAII significa "obter um recurso é inicialização" ou "obter uma responsabilidade é inicialização". Embora o nome se concentre na “inicialização”, a parte principal aqui é realmente o destruidor. A liberação determinística de recursos é uma das principais características do C ++ que o distingue da maioria das outras linguagens. Para muitos, essa é a característica mais importante .

O RAII pode ser usado para gerenciar de maneira confiável muitas coisas, como memória (por exemplo, std :: vector, std :: string ), descritores de arquivo ( std :: fstream ), conexões de rede, mutexes, conexões de banco de dados e entidades que estão distantemente relacionados a recursos. Se você precisar de uma maneira confiável de executar alguma ação e cancelá-la ao sair de um determinado escopo ou ao destruir um objeto, RAII é o que você precisa.

Vi muitos códigos nos quais a limpeza manual no final das funções se transformou em um pesadelo. No caso de exceções, essa limpeza não ocorre; portanto, nessa situação, RAII é o que você precisa . Mesmo que você não use exceções, a saída antecipada de funções pode melhorar significativamente seu código, mas apenas se você não precisar limpá-lo.

A técnica RAII é definitivamente parte do C ++ moderno, embora esteja disponível desde o início.

Digitação forte


A ideia de digitação forte tem sido muito popular ultimamente. No passado, quaisquer identificadores, tamanhos, códigos postais, preços etc. eram representados via int ou double ou outro tipo aritmético. O fato de serem compatíveis, completamente sem relação entre si, que por puro acaso são do mesmo tipo, foi uma fonte de bugs, mas o que posso fazer? Pelo menos o compilador não converte silenciosamente números e matrizes em seqüências de caracteres !

De fato, acontece que o sistema do tipo C ++ e as abstrações de custo zero * que o compilador nos fornece podem fazer muito. Basta criar tipos diferentes para identificadores, códigos postais, tamanhos (não, sem typedef, obrigado) e assim por diante. Se você estiver interessado, confira uma das palestras de Björn Fahller , Jonathan Boccara ou Jonathan Müller .

* (Mesmo que o custo da abstração seja diferente de zero, prove que é inaceitável antes de abandoná-lo)

Além de algumas adições recentes, o <algorithm> está na biblioteca padrão desde o início. Mas se você olhar para o código, as pessoas geralmente preferem escrever loops manualmente. Os motivos variam de não saber quais algoritmos padrão estão disponíveis até acreditar que "os modelos são muito lentos" (geralmente sem explicação, em comparação com o que).

Programando a fase de compilação


Coisas como metaprogramação usando modelos foram usadas desde o C ++ 98. A lógica executada no tempo de compilação pode reduzir significativamente a complexidade no tempo de execução. No passado, era inconveniente usar. A sintaxe dos modelos difere na direção da complexidade dos recursos que estão nos padrões mais recentes. Isso é algo como um idioma separado que precisamos aprender. No entanto, coisas como o envio de tags ou características não são muito complicadas de usar e escrever.

Sim, a maioria das características da biblioteca padrão apareceu com o advento do C ++ 11, mas escrevê-las para suas necessidades não é muito difícil, e algumas das mais comuns estavam no Boost antes do C ++ 11. Considero que o uso da lógica do estágio de compilação faz parte do C ++ moderno porque separa o C ++ do onipresente "C com classes".

Conclusão


O C ++ moderno não está relacionado aos novos padrões, mas à maneira como escrevemos nossos programas. Primeiro, o C ++ 98 pode ser escrito em um estilo mais ou menos moderno. Em segundo lugar, “C com classes e loops baseados em intervalo” ainda não é um C ++ moderno. Novos recursos da linguagem e das bibliotecas nos ajudam a escrever no estilo do C ++ moderno, mas eles não tornam nosso código moderno no C ++.

Source: https://habr.com/ru/post/pt429780/


All Articles