Ответ 1
Это ошибка в VС++.
Посмотрите на следующий код:
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
, где компилятор отмечает ошибку.
Разрешено ли это стандартом?
Это ошибка в VС++.
Это запрещено в соответствии со стандартом 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’
, соответственно.
Я бы сказал, что первый пример не разрешен, в соответствии с 2.23.2.1 стандарта С++:
Литерал символов один или несколькосимволы, заключенные в одинарные кавычки, как в
’x’
, необязательно предшествующий букваL
, как вL’x’
.
(Подчеркните мой.)