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