2014-03-19 8 views
5

Ich habe ein Objekt von einem Typ, zum Beispiel std::vector<int> v;
Nun sagen, ich möchte überprüfen, dass v veröffentlicht alle seine internen Speicher.
Vor der C++ 11 shrink_to_fit() Methode ist der empfohlene/garantierte Weg, dies zu tun swap() mit einem leeren std::vector<> des gleichen Typs.Erstellen eines temporären decltype

Ich möchte jedoch nicht den Typ des Objekts angeben. Ich kann decltype verwenden, um die Art zu bestimmen, so möchte ich, so etwas schreiben:

std::vector<int> v; 
// use v.... 
v.swap(decltype(v)()); // Create a temporary of same type as v and swap with it. 
        ^^ 

jedoch oberhalb der Code funktioniert nicht. Ich kann nicht scheinen, ein temporäres vom Typ decltype(v) mit einem leeren ctor (in diesem Fall) zu schaffen.

Gibt es eine andere Syntax für die Erstellung eines solchen temporären?

+0

Die empfohlene Vorgehensweise ist 'shrink_to_fit'. – chris

+0

@chris: Argh! Wahr. Ich habe diese Methode vergessen. Danke, ich bearbeite es neu, aber meine Frage ist immer noch gültig. –

Antwort

10

Das Problem ist, dass swap eine lvalue-Referenz verwendet: Sie können ein temporäres swap nicht übergeben. Stattdessen sollten Sie es sich um Schalter, so dass Sie die swap Mitglieds vorübergehend nennen:

decltype(v)().swap(v); 

Natürlich C++ 11 eingeführt, um die shrink_to_fit() Mitglied, so dass der Swap-Trick nicht mehr notwendig ist.

+0

Manchmal denke ich wirklich, es sollte einen 'lvalue_cast' geben, um lvalue aus temporary zu erstellen (ziemlich trivial als Vorlage zu definieren, aber nicht mit naked' static_cast'). Es hat alle notwendigen Eigenschaften, die Regel ist nur ein Schutz vor häufigem Fehler. –

3

Sie tun können (C++ 11):

v.clear(); 
v.shrink_to_fit(); 

oder:

{ 
    decltype(v) tmp; 

    v.swap(tmp); 
} 

vector::swap nimmt durch Bezugnahme Argument. So vorübergehend kann hier nicht verwendet werden.

5

Sie können nicht binden temporär rvalue zu einem nicht konstanten lvalue Referenz, und so kann man es nicht als Argument für swap passieren. Sie können jedoch eine Member-Funktion auf einer temporären nennen, so dass dies funktioniert:

decltype(v)().swap(v); 

In C++ 11, wäre es klarer aus der temporären zu bewegen:

v = decltype(v)(); 

oder verwenden shrink_to_fit

v.clear(); 
v.shrink_to_fit(); 

(Beachten Sie, dass, wenn Sie C++ 11 nicht haben, dann müssen Sie nicht decltype, so dass die Frage strittig ist).

1

Zur Klarstellung, decltype(v)()ist die gültige Syntax zum Erstellen eines unbenannten temporären.
Die Quelle des Fehlers, wie die anderen Antworten erklären, war, dass swap() nicht mit dem temporären von decltype(v)() zurückgegebenen funktioniert.

Verwandte Themen