涉及 `std::string` 的编译导致 Windows 错误状态

Compilations involving `std::string` cause Windows error status

最小示例:

#include <Windows.h>
#include <string>
int main(int /*argc*/, char* /*argv*/[]) {
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //Behavior the same, with or without.
    DWORD err = GetLastError();
    std::string str;
    return (int)err; //returns 127 iff line above uncommented, 0 iff commented
}

本节目returns127,对应ERROR_PROC_NOT_FOUND("The specified procedure could not be found.")。请注意 err 在 创建 std::string 之前设置 。该程序使用 MSVC 2017 在调试模式下编译。

这种行为是预期的吗?如果没有,我可以得到一些确认吗(然后,我会提交错误报告)?

GetLastError() returns the last error code to be set by a WinAPI function called by this thread. Note that WinAPI functions do not necessarily成功后设置密码:

Most functions call SetLastError or SetLastErrorEx only when they fail.

您没有调用失败的 WinAPI 函数。因此,错误代码是不确定的。它要么未初始化(意味着未定义的行为),要么由未知函数设置(只是意义不大)。标准库使用异常来指示错误,而不是 Windows API.


"Is this behavior expected?"

从某种意义上说,该行为是预期的,因为该函数未在适当的上下文中使用,因此 任何 值都是可以接受的。