Dieses Codebit wurde in C ++ 20 (mit gcc 10.1) kompiliert, ohne das typename
Schlüsselwort vor dem abhängigen Typ zu verwenden std::vector<T>::iterator
. Warum kompiliert es?
#include <vector>
template<typename T>
std::vector<T>::iterator // Why does this not require "typename" before it?
f() { return {}; }
int main() {
auto fptr = &f<int>;
}
typename
), da (ich glaube , ...) es hat eine Art , dort zu sein. Vielleicht möchten Sielanguage-lawyer
Tag hinzufügen .Antworten:
Eine der neuen Funktionen in C ++ 20 ist Down with
typename
.In C ++ 17, Sie hatten das bieten
typename
fast alle Schlüsselwort in † abhängig Kontexten einen Typen von einem Wert eindeutig zu machen. In C ++ 20 ist diese Regel jedoch stark gelockert. In allen Kontexten, in denen Sie einen Typ benötigen , ist dertypename
Schlüsselwort nicht mehr obligatorisch.Ein solcher Kontext ist der Rückgabetyp einer Funktion im Klassenbereich, wie in Ihrem Beispiel. Andere enthalten den Typ in einer Elementdeklaration, den Typ auf der rechten Seite einer using-Deklaration, die Parameterdeklaration eines Lambda, den Typ, an den Sie übergeben
static_cast
usw. Die vollständige Liste finden Sie im Dokument .† Fast alle, weil Basisspezifizierer und Mem-Initialisierer-IDs immer ausgeschlossen wurden, wie in:
template <typename T> struct X : T::type { }; // always ok
Das ist in Ordnung, denn das muss ein Typ sein. Das Papier erweitert diese Logik einfach (nun, es muss ein Typ sein, also nehmen wir einfach an, dass es ein Typ ist) auf viel mehr Orte, die Typen sein müssen.
quelle
typename
optional gemacht . Der ursprünglichetypename
Vorschlag verbot es überall dort, wo es nicht erforderlich war, aber wir hielten es für harmlos, eine Redundanz zu akzeptierentypename
.Aus der Referenz , aus c ++ 20, wird in Kontexten, in denen der abhängige Name eindeutig ein Typname ist, das
typename
Schlüsselwort nicht mehr benötigt. Speziell:quelle