为什么允许空的wchar_t文字?

时间:2011-05-27 07:46:54

标签: c++ character literals

请查看以下代码:

int main(int argc, char* argv[])
{
    // This works: (Disable Lang Ext = *Yes* (/Za))
    wchar_t wc0 = L'\0';
    wchar_t wc_ = L'';
    assert(wc0 == wc_);

    // This doesn't compile (VC++ 2010):
    char c0 = '\0';
    char c_ = ''; // error C2137: empty character constant
    assert(c0 == c_);
    return 0;
}

为什么编译器允许为宽字符定义字符文字?这对于宽泛没有意义,正如编译器标记错误的char没有意义。

标准是否允许这样做?

3 个答案:

答案 0 :(得分:11)

这是a bug in VC++

答案 1 :(得分:4)

根据ISO标准,允许。这是微软产品中的一个错误。甚至他们的page describing that particular feature也没有提到这种异常(或者令人厌恶,取决于你的观点)的行为。

字符文字的定义(取自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’中所示,可选地前面有一个字母uU,或L,分别为u’y’U’z’L’x’

答案 2 :(得分:3)

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

  

字符文字一个或多个   用单引号括起来的字符,   与’x’中一样,可选地以。{1}}开头   字母L,如L’x’

(强调我的。)