为什么允许使用空的wchar_t文字

Why is an empty wchar_t literal allowed?

本文关键字:文字 wchar 许使用 为什么      更新时间:2023-10-16

查看以下代码:

int main(int argc, char* argv[])
{
    // This works: (Disable Lang Ext = *Yes* (/Za))
    wchar_t wc0 = L'';
    wchar_t wc_ = L'';
    assert(wc0 == wc_);
    // This doesn't compile (VC++ 2010):
    char c0 = '';
    char c_ = ''; // error C2137: empty character constant
    assert(c0 == c_);
    return 0;
}

为什么编译器允许为宽字符定义字符文本?这对wide没有意义,就像对编译器标记错误的char没有意义一样。

这是标准允许的吗?

这是VC++中的一个错误。

根据ISO标准,是不允许的。这是微软产品中的一个错误。即使是他们描述这一特定功能的页面也没有提及这种异常(或令人憎恶,取决于你的观点)的行为。

字符文字的定义(取自C++0x的2.14.3,但相关位与C++03保持不变)包含:

character-literal:
    L’ c-char-sequence ’
c-char-sequence:
    c-char
    c-char-sequence c-char
c-char:
    any member of the source character set except
      the single-quote ’, backslash , or new-line character
    escape-sequence
    universal-character-name
escape-sequence:
    simple-escape-sequence
    octal-escape-sequence
    hexadecimal-escape-sequence
simple-escape-sequence: one of
    ’ " ? \ a b f n r t v
octal-escape-sequence:
     octal-digit
     octal-digit octal-digit
     octal-digit octal-digit octal-digit
hexadecimal-escape-sequence:
    x hexadecimal-digit
    hexadecimal-escape-sequence hexadecimal-digit

正如您所看到的,在L'x'中的'字符之间没有的方式。它必须是一个或多个c_char字符。事实上,这一点在以下段落(我的重点)中得到了明确说明:

字符文字是一个或多个用单引号括起来的字符,如在’x’中,可选地在前面加上字母uUL之一,如分别在u’y’U’z’L’x’中。

根据C++标准的2.23.2.1,我认为第一个例子是不允许的:

字符文字是一个或多个用单引号括起来的字符,如在’x’中,可选地在前面加上字母L,如在L’x’中。

(强调矿。)