En C++ al declarar plantillas: class o typename — ¿cuál es la diferencia y qué es mejor usar?
¡Hola a todos! Empecé a estudiar plantillas en C++ y noté que en algunos ejemplos se usa la palabra clave `class`, y en otros `typename`. Por ejemplo, estas dos declaraciones, según entiendo, hacen lo mismo:
```cpp
template
void foo(T value) { }
template
void foo(T value) { }
```
Estoy confundido. Parece que ambas opciones funcionan, pero ¿cuál es la correcta? ¿Hay alguna diferencia entre ellas, aparte de la sintaxis? Leí que `typename` apareció después, y algunos programadores antiguos prefieren `class` por costumbre. Pero me parece extraño usar la palabra `class` para un parámetro que puede no ser una clase, sino, por ejemplo, `int` o `double`. Al mismo tiempo, `typename` suena más universal.
Además, he oído que hay situaciones donde solo se puede usar `typename`, y `class` no es adecuado. ¿Es verdad? Si es así, den ejemplos. Y en general, ¿qué se considera buen estilo en C++ moderno (C++11, C++14, C++17, C++20)? ¿Qué opción se recomienda?