Nicht zulassen, dass Zeiger / Verweis auf const auf ein temporäres Objekt in C ++ genommen wird (kein C ++ 0X)

8

Ich bin mit folgendem Problem konfrontiert. Betrachten Sie die folgende Klasse:

%Vor%

und diese Funktion gibt ein double

zurück %Vor%

Wenn wir jetzt

haben %Vor%

bisher aber gut:

%Vor%

Gibt es eine Möglichkeit, Ref (wie Sie es bevorzugen) zu modifizieren, aber nicht die Funktion fun, so dass die letzte Zeile einen Fehler bei der Kompilierung zurückgibt? Bitte beachten Sie, dass Sie die Konstruktorsignatur ändern können (solange ich die Referenz wie vorgesehen initialisieren kann).

    
stepelu 09.11.2010, 12:36
quelle

4 Antworten

2

Sie mögen nicht die Syntax, um es zu verwenden, aber den Konstruktor nehmen Sie einen Zeiger anstelle eines Verweises. Sie können nicht einmal einen Const-Zeiger auf ein Temporäres setzen.

Zumindest nicht, ohne es durch einen anderen Wrapper zu schmuggeln, der hoffentlich den Code Offensichtlich falsch (TM): template <typename T> T *reftoptr(T &t) { return &t; }

macht

Wenn Sie dies so verwenden, wie reference_wrapper verwendet wird, können Ihre Benutzer tatsächlich wollen , um Provisorien zu erfassen. Solange das Ref-Objekt im selben Voll-Ausdruck auch temporär ist wie das temporäre, das es erfasst, denke ich, dass es in Ordnung ist. Also zum Beispiel

%Vor%     
Steve Jessop 09.11.2010, 12:46
quelle
3

Nein, und Ihr Code kann sogar mit einer normalen Referenz gebrochen werden. Dokumentieren Sie einfach die Tatsache, dass das übergebene Objekt persistent sein muss.

%Vor%     
Let_Me_Be 09.11.2010 12:43
quelle
1

Verwenden Sie ein Zeigerargument, um Ihr Zeigerelement zu initialisieren. Verwenden Sie keine (const) Referenz dafür - verwenden Sie einen Zeiger, um einen Zeiger zu initialisieren.

Ich habe in der Vergangenheit einige Probleme mit dem Verfolgen von Verweisen gehabt, und obwohl es nicht direkt mit Ihrer Frage zusammenhängt, könnten Sie diese beiden Threads interessant finden:

Martin Ba 09.11.2010 12:57
quelle
0

Sie können eine Vorlage verwenden. U& wird zu double& abgeleitet, und das wird nicht an rvalues ​​gebunden.

%Vor%     
Johannes Schaub - litb 13.01.2011 14:45
quelle

Tags und Links