Почему допускается пустой литерал wchar_t? - PullRequest
12 голосов
/ 27 мая 2011

Посмотрите на следующий код:

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 ]

11 голосов
/ 27 мая 2011
4 голосов
/ 27 мая 2011

Это не разрешено в соответствии со стандартом ISO. Это ошибка в продукте Microsoft. Даже на их странице , описывающей эту особенность , ничего не говорится об этом аберрантном (или отвратительном, в зависимости от вашей точки зрения) поведении.

Определение символьного литерала (взято из 2.14.3 C ++ 0x, но соответствующий бит не отличается от 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’, необязательно с предшествующей одной из букв u, U или L, например u’y’, U’z’ или L’x’ соответственно.

3 голосов
/ 27 мая 2011

Я бы сказал, что первый пример недопустим в соответствии с 2.23.2.1 стандарта C ++:

Символьный литерал - это один или несколько символов, заключенных в одинарные кавычки, как в ’x’, необязательно, перед буквой L, как в L’x’.

(выделение мое).

...