A Microsoft costumava criar um sistema C ++ que permitia acessar a API do Windows (chamada win32); então, um dia, eles inventaram o .NET e concluíram que tudo precisava mudar.
Então, eles criaram "Managed Extensions for C ++", que era basicamente C ++, mas com uma carga de extensões não padrão, adicionando palavras-chave como __gc
suporte aos recursos do .NET (como alocar no heap do GC em vez do nativo)
Mas as pessoas não gostaram disso, pois realmente não era; C ++, com todas essas palavras-chave extras, então a Microsoft a redesenhou e a chamou de C ++ / CLI, que tinha um conjunto muito menor de palavras-chave adicionais, mas introduziu alterações de sintaxe como a ^
(que é um 'ponteiro' de referência para um objeto .NET no heap do GC).
Alguns anos depois, a Microsoft percebeu que o .NET não é a bala de prata que eles disseram que era, e eles também fundiram suas equipes de combate e Windows. Parte dessa reavaliação levou à criação de uma nova API do Windows, chamada WinRT, que é um código totalmente nativo e isso significava que as extensões antigas não eram mais úteis, então a Microsoft desenvolveu suas extensões C ++ para uma que funcionava com o novo API do WinRT mais fácil - mantendo algumas extensões do C ++ / CLI (como o ^).
Então, lá está você, 3 versões diferentes de um C ++ estendido que é superficialmente C ++. Pelo menos a versão mais recente é o código nativo novamente, então você não precisa usar as extensões se não quiser, pois pode acessar diretamente a API (é chamada WRL e é muito parecida com as antigas classes de modelos ATL)
Se você acha que pode estar codificando código de plataforma cruzada, não deseja - pode alterar as chamadas da API, mas não pode usar o ^
em nenhum compilador que não seja o Visual C ++. Eu recomendo usar a API WRL e manter seu código o mais padrão possível, dado o 'código extra' que você precisa escrever em comparação com C ++ / CX não é tão bom.