Quelle est la différence entre typedef et using en C++ ? Quand utiliser quoi ?
Bonjour, collègues ! J'ai récemment commencé à étudier le C++ et je suis tombé sur deux façons de créer des alias de types : le bon vieux `typedef` et le nouveau `using` (ou alias declaration), apparu en C++11.
Je comprends qu'ils font tous les deux la même chose en apparence. Par exemple, je peux écrire :
```cpp
typedef unsigned long long ULL;
using ULL = unsigned long long;
```
Et apparemment il n'y a aucune différence. Mais j'ai entendu dire que `using` est plus cool et qu'il est recommandé dans le code moderne. Pourquoi ? Quelle est la véritable différence ? Y a-t-il des cas où `typedef` ne fonctionne pas, mais `using` fonctionne ? Ou l'inverse ?
Je suis particulièrement intéressé par les cas complexes : travail avec les pointeurs de fonctions, les templates, les types imbriqués. J'ai essayé de créer un alias pour une classe template avec `typedef` et je n'ai pas réussi. Peut-être que je fais quelque chose de mal.
Voici un exemple qui me trouble :
```cpp
// Cela fonctionne ?
template
typedef std::vector Vec; // Erreur de compilation !
// Et cela ?
template
using Vec = std::vector