In C++ bei der Deklaration von Templates: class oder typename — was ist der Unterschied und was sollte man verwenden?
Hallo zusammen! Ich habe angefangen, Templates in C++ zu lernen, und mir ist aufgefallen, dass in manchen Beispielen das Schlüsselwort `class` verwendet wird, in anderen `typename`. Zum Beispiel machen diese beiden Deklarationen meines Verständnisses nach dasselbe:
```cpp
template
void foo(T value) { }
template
void foo(T value) { }
```
Ich bin verwirrt. Beide Varianten scheinen zu funktionieren, aber welche ist korrekt? Gibt es einen Unterschied zwischen ihnen außer der Syntax? Ich habe gelesen, dass `typename` später eingeführt wurde und einige ältere Programmierer aus Gewohnheit `class` bevorzugen. Aber es erscheint mir seltsam, das Wort `class` für einen Parameter zu verwenden, der keine Klasse sein muss, sondern zum Beispiel `int` oder `double` sein kann. Gleichzeitig klingt `typename` universeller.
Außerdem habe ich gehört, dass es Situationen gibt, in denen nur `typename` verwendet werden kann und `class` nicht geeignet ist. Stimmt das? Wenn ja, geben Sie bitte Beispiele. Und generell, was gilt in modernem C++ (C++11, C++14, C++17, C++20) als guter Stil? Welche Variante wird empfohlen?