2010-11-21 3 views
9

Ich arbeite an Linux GCC-Umgebung, und ich muss Funktionsargumente, die Klassen mit Standardwerten sind, initialisieren. Wenn ich mit temporärer Instanz der Klasse zu tun, dass es einen Fehler wie diese macht: „Standardargument für [Funktionsargument] type [Klassennamen] hat zum Beispiel:.wie Funktionsargumente zu initialisieren, die Klassen mit Standardwert sind

void foo(std::wstring& str = std::wstring()) 

Fehler: Standardargument für ' std :: wstring & str‘hat Typ 'std :: wstring' PS dieser Code ohne Fehler kompiliert wird, oder eine Warnung mit VC++.

Wie kann ich den Standardwert initilize?

+0

was wollen Sie erreichen? Für mich sieht es bedeutungslos aus, was du tust. – Simone

+0

@Simone -dies ist wahrscheinlich eine Prüfung, um sowohl die Vorteile von Standardwerten als auch das Senden per Referenz zu erhalten. – rkellerm

+0

Bindung an nicht-Const Referenzen ist nicht standardkonform, aber VC++ erlaubt es als Erweiterung AFAIK. –

Antwort

8

Dies soll nicht kompilieren. Sie versuchen, einen Rvalue an eine nicht konstante Referenz zu binden. Sagen Sie std::wstring const & str und es sollte funktionieren.

9

Sie könnten nur erstellen Funktionsüberlastung:

void foo() { 
    std::wstring str; 
    foo(str); 
} 

aber ich vermisse wirklich den Punkt.

EDIT: Ich meine, der Zweck dieser Funktion ist fast sicher, eine Eingabezeichenfolge zu ändern. Wenn Sie eine leere Eingabezeichenfolge angeben, auf die Sie später nicht zugreifen können, warum?

+0

Zweck der Funktion kann auch die Eingabezeichenfolge abrufen, ohne sie zu ändern. Die Weitergabe durch Referenz kann auch dazu dienen, den Aufruf des Kopierkonstruktors zu verhindern. – rkellerm

+0

Es gibt viele Situationen, in denen es nützlich sein könnte, sagen wir zum Beispiel, dass dies keine Zeichenkette, sondern ein Puffer ist, oder dass einige Daten (wie detaillierte Protokolle) von der Methode eingegeben werden, aber Sie interessieren sich nur für das Ergebnis. Ihre Lösung behebt sanft das Problem mit standardkonformem Code :) –

+0

@ rursw1 ja, aber - in solchen Fällen - wenn Sie keine ** const ** Referenz übergeben Ich denke, die Schnittstelle der Funktion ist irgendwie falsch. – Simone

3

Sie können nicht-konstante Referenzen nicht an rvalues ​​binden. Vorbei an Wert funktionieren würde:

void foo(std::wstring str = std::wstring()) 

oder Weitergabe durch Verweis auf const:

void foo(const std::wstring& str = std::wstring()) 
+0

Ich verstehe deinen letzten Satz nicht wirklich. Auch wenn der Compiler das Temporäre und die Kopie nicht optimiert, wie teuer wird das Kopieren einer leeren Zeichenkette wirklich? Und wenn das Temporäre weg ist, was bleibt übrig, um sich zu bewegen? –

+0

@Charles: Was passiert, wenn ein Benutzer * eine Zeichenfolge als Argument liefert? Dann muss es in C++ 03 kopiert werden. – fredoverflow

+0

Entschuldigung, ich dachte, du beziehst dich auf die Verwendung des Standardarguments in deinem Kommentar. Wenn der Benutzer in vielen Fällen eine Zeichenfolge bereitstellt, die in vielen Fällen temporär ist, kann er in C++ 03 verwendet werden. Eine Kopie muss nicht immer passieren. –