Avatar ·

Qual é a diferença entre typedef e using em C++? Quando usar cada um?

Olá, colegas! Recentemente comecei a estudar C++ e me deparei com duas formas de criar aliases de tipos: o bom e velho `typedef` e o novo `using` (ou alias declaration), que apareceu no C++11. Eu entendo que ambos fazem basicamente a mesma coisa. Por exemplo, posso escrever: ```cpp typedef unsigned long long ULL; using ULL = unsigned long long; ``` E parece que não há diferença alguma. Mas ouvi dizer que `using` é mais legal e é recomendado no código moderno. Por quê? Qual é a diferença real? Existem casos onde `typedef` não funciona, mas `using` funciona? Ou vice-versa? Estou particularmente interessado em casos complexos: trabalho com ponteiros para funções, com templates, com tipos aninhados. Tentei criar um alias para uma classe template usando `typedef` e não consegui. Talvez eu esteja fazendo algo errado. Aqui está um exemplo que me confunde: ```cpp // Isso funciona? template typedef std::vector Vec; // Erro de compilação! // E isso? template using Vec = std::vector