2017-02-02 2 views
3

gefunden Abhilfe wie rvalue als L-Wert zu verwenden:Rvalue als L-Wert

&(std::string()=std::string("Hello World")); 

aber nicht sicher, ist es legal, diese Konstruktion zu verwenden.

-Code gleich ist dies für mich arbeiten

typedef std::pair<const char *, const std::string *> custom_pair; 

std::ostream & operator <<(std::ostream & os, const custom_pair & kv) 
{ 
    if (kv.first && kv.second && !kv.second->empty()) 
     os << kv.first << *kv.second; 

    return os; 
    } 

std::ostringstream q; 
q << custom_pair("example_string=", &(std::string() = IntToString(1))); 

wo custom_pair Konstruktor Adresse als zweiten Parameter benötigt, kann aber jemand erklären, ist es richtig, diese zu benutzen?

+1

Zeigen Sie, was 'custom_pair()' eigentlich ist, bitte. Stellen Sie nach Bedarf ein [MCVE] bereit! Halten Sie Ihre Fragen in sich geschlossen, anstatt nur auf Links zu verweisen (diese können als zusätzliche Informationen verwendet werden). –

+2

Das scheint Ärger. Speichern der Adresse eines temporären Objekts? – tadman

+0

* Derselbe Code funktioniert für mich * Was bedeutet * working * in Ihrem Fall? Ich vermute, Sie werden auf UB stoßen, wenn Sie den Zeiger dereferenzieren. –

Antwort

2

Es ist in Ihrem Fall in Ordnung. Das temporäre Objekt wird am Semikolon nach der Operation "< <" zerstört. Bis dahin wird es nicht mehr verwendet.

Achten Sie darauf, dieses Muster nicht zu verwenden, wenn der Zeiger möglicherweise noch verwendet wird, nachdem das temporäre Objekt zerstört wurde.

Das sagte, ich würde diesen Code in einem Code-Review nicht akzeptieren. Jeder, der dies liest, hätte zu viel Mühe, um zu bestimmen, warum es funktioniert. Wie Sie an den Kommentaren unter Ihrer Frage sehen können.

+0

Ja, ich verstehe, dass es als Schwachsinn aussieht, aber die Arbeit motiviert mich, diese Antwort zu geben –

0

gefunden Abhilfe wie rvalue zu verwenden, wie L-Wert

Sie brauchen keine Abhilfe, wie rvalue als L-Wert zu verwenden, sondern den Code beheben, die Sie diese Abhilfe nicht benötigen. Zum Beispiel sollte der zweite Typ des Paares std::string sein, nicht const std::string * und alle Ihre Probleme würden verschwinden.

+0

Das ist ein guter Rat, aber in diesem Fall machen wir eine Kopie des Objekts, so dass nicht optimal im Speicher Parameter verwendet, nein? –

+0

@ Всеволодившин Die klassische verfrühte Optimierung –

+0

@ ВсеволодИвшин "die vorzeitige Optimierung ist die Wurzel allen Übels". Vor allen rvalue, wenn Sie es nicht in lvalue "konvertieren" würde effizient in Parameter verschoben werden. Ihr Code wäre also sauber, lesbar und trotzdem schnell. – Slava

2

aber nicht sicher ist es legal, diese Konstruktion zu verwenden.

Sie sind an der Grenze von in UB laufen.

std::ostringstream q; 
q << custom_pair("example_string=", &(std::string() = IntToString(1))); 

funktioniert in Ordnung, da alle temporären Objekte noch aktiv sind, wenn der Zeiger dereferenziert wird. Ändern Sie das zu:

std::ostringstream q; 
custom_pair p("example_string=", &(std::string() = IntToString(1))); 
q << p; 

und Sie sind plötzlich in UB-Gebiet.