Unterschiedlicher Umgang mit vorzeichenbehafteten Werten zwischen MSVC und GCCC++

Programme in C++. Entwicklerforum
Anonymous
 Unterschiedlicher Umgang mit vorzeichenbehafteten Werten zwischen MSVC und GCC

Post by Anonymous »

Nehmen Sie den folgenden Codeabschnitt, der einfach eine Zeichenfolge kürzt und Leerzeichen an beiden Enden entfernt:

Code: Select all

const std::string TrimString(const std::string& s)
{
const auto iter = std::find_if(s.cbegin(), s.cend(), [](auto c) -> bool { return !std::isspace(static_cast(c)); });
return iter != s.end() ?
std::string(iter, std::find_if(s.crbegin(), s.crend(), [](auto c) -> bool { return !std::isspace(static_cast(c)); }).base()) :
std::string();
}

//Usage
std::vector d{ 0xc5, 0xbc };     // example UTF-8 character
std::string uft8(d.begin(), d.end());

std::string trimmed = TrimString(utf);
Wenn Sie dies unter MSVC (17.14.19) ausführen, stürzt der obige Code tatsächlich ab, aber unter Linux mit GCC (14.2.0) funktioniert er perfekt.
Jetzt weiß ich, WARUM er abstürzt, und er ist leicht zu beheben, aber ich versuche, diesen Unterschied zu verstehen und sogar, was der Standard dazu sagt.
Der Grund für den Absturz ist, dass auf MSVC,

Code: Select all

std::isspace
[/b] nimmt einen int an und dieser muss im Bereich von -1 -> 255 liegen (gemäß dem Runtime-Crash-Dialog). Aber warum funktioniert das dann auf GCC?
Offensichtlich hat das mit auto als Parameter des Lambda zu tun. In MSVC ist der auto-Parameter des Lambda wahrscheinlich ein char, sodass jedes Byte um ein Vorzeichen erweitert wird, was den Absturz verursacht (da es sich um einen negativen Wert handelt). Ich bin mir nicht sicher, was im Fall von GCC passiert. Sicherlich würde dies auch etwas Ähnliches bewirken? Ist

Code: Select all

std::isspace
[/b] weniger wählerisch unter Linux?
Wie gesagt, es ist eine einfache Lösung, aber ich suche nach mehr Verständnis für den Unterschied zwischen MSVC und GCC in dieser Hinsicht.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post