Warum wird der Konstruktor std :: string zurückgesetzt? GetLastError

Ich rufe Windows-APIs aus C ++ - Code auf und habe eine Hilfsmethode, mit der ich das @ ausführen kanFormatMessage Stuff und werfen eine Ausnahme für die Fehlerbehandlung. Die Signatur der Funktion ist

void throw_system_error(const std::string& msg_prefix, DWORD messageid)

Ich habe etwas merkwürdiges bemerkt. Dieser Code funktioniert nicht richtig:

handle = ...;
if (handle == NULL) {
    throw_system_error("something bad happened", GetLastError());
}

Der Fehlercode, der an @ übergeben withrow_system_error ist immer Null.

Wo das gut funktioniert:

handle = ...;
if (handle == NULL) {
    DWORD error = GetLastError();
    throw_system_error("something bad happened", error);
}

Etwas mehr Nachforschungen haben ergeben, dass diese Version das gleiche Problem hat:

handle = ...;
if (handle == NULL) {
    std::string msg("something bad happened");
    DWORD error = GetLastError();
    throw_system_error(msg, error);
}

s sieht für die ganze Welt so aus, als ob der Konstruktor vonstd::string setzt den Fehlercode zurück.

Meine Vermutung wäre, dassstd::string reserviert intern Speicher, wodurch ein Systemaufruf ausgelöst wird, der den letzten Fehler auf Null zurücksetzt.

Weiß jemand was hier eigentlich los ist?

Visual C ++ 2015, 64 Bit.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage