Assim como o @jcbritobr eu tenho uma loooonga estrada com o C++. Usei tanto na indústria de telecomunicações, quanto desenvolvendo games, quanto num passado onde o C++ Builder ainda era uma das principais linguagens do mercado, ao lado do Delphi e do Visual Basic.
Hoje é uma linguagem um tanto árida. Isso por causa da decisão da isocpp de que o compilador deve se manter compatível até o início dos tempos. Isso significa que é uma linguagem cheia de “pegadinhas” e cheia de legados que incomodam quem está começando. Você é praticamente obrigado a ler livros de boas práticas, como os “Effective” da vida. E, se prepare, porque no caso do C++ são QUATRO Effective: Effective C++, More Effective C++, Effective Modern C++ e Effective STL.
Além disso, o C++ não é (e não quer ser) uma linguagem defensiva. Na verdade, o paradigma dela é o OPOSTO disso. Ele é feito para te deixar programar do jeito que você quiser, mesmo que você queira programar errado. Então é 100% tarefa sua, de programador, programar defensivamente e deixar a semântica do seu programa clara para os próximos. E isso torna muito difícil de se garantir em uma equipe onde haja júniores. Só para dar alguns exemplos:
- Você pode usar um comando chamado const_cast para retirar o const de uma variável const e modifica-la. Mas isso pode ter consequências nefastas imprevisíveis. Mas é vc programador hardcore que tem que saber disso.
- Você pode, através de truques de ponteiros, substituir o valor em uma referência que, teoricamente, deveria ser insubstituível;
- Você pode fazer casts sinistros como de um objeto para um array de bytes (e vice-versa). Pode ser bem útil se está escovando bits em redes, mas pode ser bem perigoso também
Por fim, um último detalhe é que é uma linguagem não gerenciada. Ou seja, você tem que controlar memória na mão. Os smart pointers já facilitaram muito, mas não se engane. Você ainda terá que saber muito mais detalhes do que em linguagens com GC, ou mesmo em linguagens onde eles já foram implementados desde o início. Sempre terá um código legado para interagir, sempre terá uma situação de conversão bizarra de ponteiro, etc. E isso vai te incomodar, muito.
Em resumo, por mais que eu ame essa linguagem, não estou impressionado dela estar desaparecendo - até mesmo em mercados em que ela era certa como o de games. Hoje temos alternativas melhores: seja no Rust ou na Unity. Obviamente uma linguagem importante dessa vai levar décadas para chegar no ostracismo de um Cobol, mas não estou mais tão certo assim de que valha a pena um mega investimento nela só por questões de estudo.
E quem me acompanha sabe que, nos últimos 20 anos, eu falava o oposto disso.