Visual C++和gcc之间从std :: isblank返回的不一致.哪一个错了?

Joe*_*Joe 8 c++ gcc locale visual-studio

std::isblank在Windows上的Visual C++和Ubuntu上的gcc之间的调用中看到不一致的行为,我想知道哪一个是正确的.

在两个编译器上 - 当默认语言环境是"C"语言环境时 - 以下调用返回false

std::isblank('\n');  
Run Code Online (Sandbox Code Playgroud)

这就是我的期望.它与我在cppreference.com上看到的相符

在默认的C语言环境中,只有空格(0x20)和水平制表符(0x09)被归类为空白字符.

但是对于C++,我们还有一个带std::locale参数的版本

std::isblank('\n', std::locale::classic()); 
Run Code Online (Sandbox Code Playgroud)

在这里,我供应std::locale::classic.这不应该等同于之前的电话吗?因为当我在Windows上调用第二个版本时,它返回true.它认为换行符是空白字符.Linux仍然说错误.

我的理解(约std::locale::classic)是否正确?如果是这样,Visual C++版本是错误的吗?

Nat*_*ica 5

是的,MSVS错了. [locale.statics]声明:

static const locale& classic();
Run Code Online (Sandbox Code Playgroud)
  1. "C"语言环境.

  2. 返回:实现经典"C"语言环境语义的语言环境,相当于值locale("C").

  3. 备注:此区域设置,其构面及其成员函数不随时间变化.

因此如下:

std::isblank('\n', std::locale::classic()); 
Run Code Online (Sandbox Code Playgroud)

是相同的:

std::isblank('\n');  
Run Code Online (Sandbox Code Playgroud)

在哪里locale("C")被称为.