2016-04-01 3 views
6

Ein vector<int>(v1) Ausdruck fehlschlagen ergibt sich ein temporäres Objekt, und kann auf der rechten Seite von operator= gestellt werden, aber wenn wir einen vector<int>(v1) Ausdruck als Anweisung verwenden, wird es nicht in Visual Studio 2010 10.0.30319.1 RTMRel. Detaillierte Fehlerinformationen sind in den Kommentaren im folgenden Code enthalten. Warum passiert das?Warum die Aussage „Vektor <int> (v1),“

vector<int> v1; 
v1.push_back(10); 
v1.push_back(20); 
v1.push_back(30);  
vector<int> v3 = vector<int>(v1); //OK, deliberately code like this. 
vector<int>(v1); //error C2086: “std::vector<_Ty> v1”: redefinition 

In dem Buch „C++ Coding Standards: 101 Regeln, Richtlinien und Best Practices“, Kapitel 82 "die akzeptierten Idiome verwenden wirklich Kapazität zu schrumpfen und wirklich Elemente löschen". Es gibt eine Erklärung ab:

container<_Type>(c).swap(c); 

Ich verstehe nicht, und will nur container<_Type>(c) testen, was bedeutet es?

+0

Bitte verwenden Sie vier Leerzeichen vor den Codezeilen, um sie als Code zu markieren und Zeilenumbrüche hinzuzufügen (für zukünftige Beiträge, da @Yu Hao bereits Ihren aktuellen Beitrag bearbeitet hat) – Thomas

+0

"wenn wir' vector (v1) 'expression als a verwenden Aussage, [es scheitert] "- ok, aber warum willst du das tun? Was willst du erreichen? –

+0

Warum glauben Sie, dass es eine gültige Aussage ist? Welchen Effekt erwarten Sie? – kfsone

Antwort

1

Ich verstehe, dass vector<int>(v1) eingängig ist, aber ich sehe nicht den Punkt, es zu benutzen. Wie andere darauf hingewiesen haben, ist dies Standardverhalten.Wenn Sie nach einer Lösung suchen, hier sind zwei Lösungen:

vector<int>::vector(v1); 
vector<int> { v1 }; 

EDIT (die Frage geändert hat): container<_Type>(c).swap(c); Ich verstehe nicht ...“ Das von container<_Type>(c); unterscheidet. Ein Behälter kann eine größere Kapazität haben als die, die durch size gemeldet wurde (siehe reserve). Die Reserve hilft, die Anzahl einiger Operationen zu minimieren. Wenn Sie ein neues Element hinzufügen, verwendet der Container den bereits zugewiesenen Speicher. Zum Beispiel könnte Ihr Vektor Platz für 10 Elemente haben, aber tatsächlich hat er nur 1. Wenn Sie ein neues Element hinzufügen, bleibt Platz für 8 Elemente. Das obige Konstrukt entfernt die Reserve, um Speicher zu sparen. Zuerst wird eine Kopie des Originals erstellt (diese Kopie hat keine Reserve). Dann werden die zugrunde liegenden Daten (Zeiger) des ursprünglichen Vektors durch den neuen ersetzt (siehe swap), und das temporäre Objekt (das jetzt den Speicher des Originals besitzt) wird verworfen.

"... um container<_Type>(c) zu testen, was bedeutet das?" Wie oben verwendet bedeutet "erstellen Sie eine temporäre Kopie von c". Isoliert betrachtet sieht es wie ein Kopierkonstruktor aus, deklariert aber tatsächlich ein Objekt. Der Unterschied ist durch den Punktoperator gegeben.

6

vector<int>(v1); ist das gleiche wie vector<int> v1;. d.h. variable Neudefinition.

+1

Und der Grund für diese albernen Klammern ist, dass Sie sie für komplexere Fälle wie 'std :: vector (* pFunc) (std :: list )' brauchen . Das '*' steht hier für 'pFunc', nicht für' std :: vector '. – MSalters

4

vector<int>(v1) Ausdruck ergibt sich ein temporäres Objekt, und kann auf der rechten Seite von operator= gestellt werden, aber wenn wir vector<int>(v1) Ausdruck als Anweisung verwenden, werden wir scheitern ...

Die einfache Erklärung ist anders vom Compiler behandelt:

vector<int>(v1); //error C2086: “std::vector<_Ty> v1”: redefinition 

ist eine alternative Möglichkeit von wri

ting
vector<int> v1; 

So sind neu zu definieren Sie v1 und der Compiler beschwert.


Um Ihre temporären Initialisierung arbeiten Verwendung zum Beispiel

void foo(const std::vector<int>& v) 
{ 
} 

und rufen

foo(vector<int>(v1)); 

oder einfach

(std::vector<int>)(v1); // this creates a temporary which is immediately disposed 

zu sehen See live demo for the latter


1) Stolen aus @Sergey A ‚s answer, aber er zog es zu löschen

Verwandte Themen