C ++ rvalue Provisorien in der Vorlage

8

Können Sie mir bitte den Unterschied zwischen den Mechanismen erklären:

%Vor%

ist meine Argumentation in Bezug auf Instanziierung korrekt? Warum wird nicht zuerst als const T& instanziiert?

Danke

    
Anycorn 08.06.2010, 05:35
quelle

4 Antworten

3

Weil function einen nichtkonstanten Wert zurückgibt. Nur Objekte können const sein, weil sie einen Zustand speichern, der geändert werden könnte, wenn er nicht const wäre. Was du dort zurückbringst, ist kein Objekt, sondern ein reiner Wert. Vom Konzept her sind sie nicht modifizierbar (wie zum Beispiel Enumerationskonstanten), aber sie sind nicht const-qualifiziert (wie zum Beispiel, Enumerationskonstanten).

    
Johannes Schaub - litb 08.06.2010, 06:31
quelle
2

Ich denke, dass Sie zwischen rvalues ​​und dem const Qualifier möglicherweise verwirrt sind. function gibt einen nicht konstanten rvalue temporary vom Typ int zurück, so dass der Compiler T als int dekomprimiert. Wie Sie darauf hinweisen, können Sie ein temporäres an ein const ref binden (c ++ 03 12.2 / 5), aber der Compiler fügt keine cv-Qualifizierer hinzu, um einen Funktionsaufruf gut gebildet zu machen. Da Sie die Vorlagenfunktion nicht steuern können, gibt es zwei Möglichkeiten (zusätzlich zu der von Ihnen geposteten Lösung).

(1) Explizite Vorlagenparameter: function2<const int>(function())

(2) cv qualifizieren Rückkehr: const int function();

Beide Lösungen sind gut geformt. (1) scheint die bessere Lösung, IMHO, da (2) unkonventionell und albern ist.

Edit: Tatsächlich kann der abgeleitete Typ cv-qualifizierter sein als das Argument für ein ref-Template-Argument, aber nur, wenn die Typableitung sonst fehlschlagen würde (c ++ 03 14.8.2.1/3). In diesem Fall schlägt Typ-Deduction nicht fehl, führt jedoch zu einem fehlerhaften Funktionsaufruf (SFINAE gilt nicht, da die Template-Funktionsspezialisierung selbst nicht fehlerhaft ist).

Wenn die Absicht des Vorlagenautors war, das Argument nicht zu ändern, sollte es als ein const Referenzargument deklariert werden, so dass dies ein Fehler in der Vorlagenbibliothek sein könnte, oder es könnte das Argument ändern, in welchem ​​Fall Sie das tun tun wird fehlschlagen, wo die Funktion versucht, das Argument zu ändern.

Edit: Wie FredOverflow hervorhebt, sind nicht-klasse rvalues ​​durch den Standard 3.10 / 9 immer unqualifiziert. So (2), was unter gcc 4.3 funktioniert, ist eigentlich ein Compiler Bug (gcc & lt; 4.5, nach FredOverflow).

    
academicRobot 08.06.2010 07:09
quelle
0

In dieser Zeile

%Vor%

nach der Rückgabe von function2 kann das Argument, das an es übergeben wird, seinen Wert ändern, aber da function () zurückgibt und nur einer temporären Variablen zugewiesen wird, was aber mit dieser temporären Variable passieren würde, nachdem sie den Gültigkeitsbereich verlässt, ist das Problem, deshalb Compilerbeschwerden.

    
Kevin Le - Khnle 08.06.2010 05:41
quelle
0

Um den ersten Aufruf zu kompilieren, ist es notwendig, Funktion 2 mit T & amp; & amp; Parameter - das ist rvalue, Referenz auf temporäres Objekt. Im zweiten Aufruf ist v der Wert lvalue, OK. Wenn Ihr Compiler rValue-Referenzen nicht unterstützt, kann der erste Aufruf nur mit T-Parameter ohne Referenz kompiliert werden.

    
Alex F 08.06.2010 05:46
quelle

Tags und Links