Waarom hoef ik de typenaam niet op te geven voor een afhankelijk type in C++20?

Waarom hoef ik de typenaam niet op te geven voor een afhankelijk type in C++20?

Een van de nieuwe functies in C++20 is Down with typename .

In C++17 had je om de typename . op te geven zoekwoord in bijna alle afhankelijke contexten om een ​​type van een waarde te onderscheiden. Maar in C++20 is deze regel veel versoepeld. In alle contexten waar u nodig om een ​​type te hebben, de typename zoekwoord is niet langer verplicht.

Een dergelijke context is het retourtype van een functie in het klassenbereik, zoals in uw voorbeeld. Anderen omvatten het type in een lidverklaring, het type aan de rechterkant van een gebruiksdeclaratie, de parameterdeclaratie van een lambda, het type dat u doorgeeft aan static_cast , enz. Zie de krant voor de volledige lijst.

Bijna allemaal omdat basisspecificaties en mem-initializer-id's altijd werden uitgesloten, zoals in:

template <typename T> struct X : T::type  { }; // always ok

Dit is oké omdat, nou ja, dat nodig een soort zijn. De krant breidt deze logica eenvoudig uit (nou ja, het moet een type zijn, dus laten we aannemen dat het een type is) naar veel meer plaatsen die typen moeten zijn.


Van de referentie, van c++20, in contexten waar de afhankelijke naam ondubbelzinnig een typenaam is, de typename zoekwoord is niet meer nodig. In het bijzonder: