Verstaendnisfrage String Rueckgabe C++ / GCC5 C++11 ABI

03/02/2016 - 19:48 von Frank Graf | Report spam
Hallo,

folgender Code (Fragment vom Newsreader Pan) funktioniert ab GCC5 mit dem
neuen C++11 ABI nicht mehr:


std::string
Prefs :: get_string (const StringView& key, const StringView& fallback)
const
{
if (!_strings.count (key))
_strings[key] = fallback;
return _strings[key];
}

Der Rückgabewert (ein String) enthàlt wàhrend der Laufzeit zufàllige
Zeichen.

Hier:

https://bugzilla.gnome.org/show_bug.cgi?idu4698

ist die Problematik beschrieben. Sollte man den Typ std::string nie als
Rückgabetyp verwenden?

Wàre folgende Code Änderung ok (sie funktioniert soweit), oder eher
suboptimal?

StringView
Prefs :: get_string (const StringView& key, const StringView& fallback)
const
{
StringView pref_string;
if (!_strings.count (key))
_strings[key] = fallback;
pref_string = _strings[key];
return pref_string;
}

StringView ist ebenfalls eine Stringklasse. Könnte man problemlos
std::string als Ersatz für StringView innerhalb der Funktion (und
Rückgabetyp) verwenden?



Frank
 

Lesen sie die antworten

#1 Florian Weimer
03/02/2016 - 20:37 | Warnen spam
* Frank Graf:

folgender Code (Fragment vom Newsreader Pan) funktioniert ab GCC5 mit dem
neuen C++11 ABI nicht mehr:


std::string
Prefs :: get_string (const StringView& key, const StringView& fallback)
const
{
if (!_strings.count (key))
_strings[key] = fallback;
return _strings[key];
}



Das funktioniert doch.

Der Rückgabewert (ein String) enthàlt wàhrend der Laufzeit zufàllige
Zeichen.



Der Fehler liegt woanders.

Hier:

https://bugzilla.gnome.org/show_bug.cgi?idu4698

ist die Problematik beschrieben. Sollte man den Typ std::string nie als
Rückgabetyp verwenden?



Das ist nicht das Problem, die Ursache ist die falsche Verwendung der
c_str()-Methode. Das Problem kann auch bei Iteratoren o.à. auftauchen.
Das war schon immer falsch und konnte auch so schon zu Bugs führen.

StringView ist ebenfalls eine Stringklasse. Könnte man problemlos
std::string als Ersatz für StringView innerhalb der Funktion (und
Rückgabetyp) verwenden?



Woher sollen wir das wissen, ohne die Definition von StringView zu kennen?

Ähnliche fragen