Ich habe endlich begonnen zu lesen auf c++11 und ich verstehe nicht, warum Trailing-Return-Typen erforderlich sind.Warum wurde das Hinzufügen von Trailing-Return-Typen in C++ 11 benötigt?
stieß ich auf das folgende Beispiel, das das Problem hervorzuheben verwendet wird:
template<class Lhs, class Rhs>
decltype(lhs+rhs) adding_func(const Lhs &lhs, const Rhs &rhs) {return lhs + rhs;}
Das Beispiel ist illegal, weil decltype(lhs+rhs)
nicht funktioniert, da die Identifikatoren lhs
und rhs
nur gültig, wenn die Parsing-Phase sind .
Ich denke, meine Frage ist über das Timing von decltype
Auflösung. Wenn ich mich nicht irre, wird das Schlüsselwort decltype
verwendet, um den Typ eines Ausdrucks zur Kompilierzeit zu bestimmen.
Ich sehe keinen Nachteil darin, dass decltype
die Auflösung des Typs durchführt, nachdem alle Analyse abgeschlossen ist (was für das obige Beispiel gut funktionieren würde). Ich glaube, das wäre ein einfacher Weg gewesen, das Problem zu lösen ...
Stattdessen wird der C++ 11-Standard bietet Hinter-Return-Typ:
template<class Lhs, class Rhs>
auto adding_func(const Lhs &lhs, const Rhs &rhs) -> decltype(lhs+rhs) {return lhs + rhs;}
Ich habe keinen Zweifel, dass ich fehle etwas, da ich die andere Verwendung von Trailing-Return-Typen nicht sehen kann. Wo ist der Fehler in meiner Argumentation?
Die trailing-return-Typen scheinen mir eine zu komplexe Lösung zu sein, da die Auflösung des Typs decltype
nach dem Parsing des gesamten Funktionskörpers genauso gut funktionieren würde.
Danke für Ihre hervorragende Antwort, ich sehe die Anwendungen jetzt. Ich wünschte, ich könnte einen zusätzlichen Cookie für die C++ 14 Referenz geben! –
Auf der C++ 14-Sache: ist es endgültig, dass das enthalten sein wird? Es klingt wie eine Welt der Verletzung in Bezug auf Dokumentation ... – MFH
@MFH: Es ist in der [C++ 14 Community Draft] (http://isocpp.org/blog/2013/05/new-paper-n3690-programming- Sprachen-C-Ausschuss-Entwurf). Unvorhersehbare Konsequenzen werden also wahrscheinlich in C++ 14 liegen. Und ja, es könnte etwas schmerzhaft für die Dokumentation sein. Aber wiederum bedeutet das, dass Sie keine unnötige Redundanz haben, wie zB 'declltype', um den Typ abzuleiten, der genau dem Code * in der Funktion * entspricht. –