2011-05-27 27 views
12

ルック:なぜ空の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の意味がないのと同じように、広い意味を持ちません。

標準によって許可されていますか?

+0

gcc 4.6.0は両方のステートメントを拒否します。 – pmr

答えて

11

これはa bug in VC++です。

+0

確かに。そして[それは固定されるように見えません](https://connect.microsoft.com/VisualStudio/feedback/details/250372/vc-allows-empty-wide-characters-but-not-empty-文字) –

+3

VC++ 2023にこのバグがあるのだろうか... –

+0

うわー!私はこれのために何時間も無駄に過ごしました(私はVS2010です)。 L ''が文字列に変更を加えることはないと仮定するのは私の間違いでした。 –

3

私は、最初の例は、C++標準の2.23.2.1ごとに、許可されていないことを主張するだろう:

文字リテラルは、一重引用符で囲ま一つ以上の 文字、’x’のように です場合によっては 文字の後にLのように、L’x’のように。

(重点鉱山。)

4

これは、ISO規格ごとに許可さないです。これはMicrosoft製品のバグです。彼らの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文字の1つ以上でなければなりません。実際には、これは次の段落で明示されている(私の強調):

一つ以上の文字は、必要に応じて文字uの一つが先行し、’x’のように、単一引用符で囲まれたリテラル文字、 UまたはLのように、それぞれu’y’,U’z’またはL’x’のように。

関連する問題