Подтвердить что ты не робот

Почему пустой литерал wchar_t разрешен?

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

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, где компилятор отмечает ошибку.

Разрешено ли это стандартом?

4b9b3361

Ответ 2

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

Определение символьного литерала (взятое из 2.14.3 для С++ 0x, но соответствующий бит не изменяется от С++ 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

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

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

(Подчеркните мой.)