2010-01-16

C++0xでは、文字列リテラルから非constなポインタへの変換はできない

75 :デフォルトの名無しさん:2010/01/15(金) 19:30:19
char *p = "hello world!";

このクソ変換N3000で無くなったんだな
良いことだ

C++0x 8の>>75

はて、そうだっただろうか。気になったので調べてみた。

たしか、n3000では、Compatibility Featuresから、Implicit conversion from const stringsが削除されていた。私はこれだけを見て、やはりdeprecatedにするのは無理があったのでやめたのか、と思っていた。

ところが、Standard Conversionsを見ると、Array-to-pointer conversionの項目から、文字列リテラルは非constなポインタに変換できるという項目が、ばっさり削除されているではないか。なるほど、もはやdeprecatedにすらしないというわけか。

すると、このようになる。

    // well-formed
    // Array-to-pointer conversionが行われる。
    char const * ptr = "superior C++0x programmers" ;

    // ill-formed
    // Array-to-pointer conversionは行われるものの、
    // cv-qualiferを消すことはできない。
    char * ptr = "Silly C idiots" ;

    // ill-formed
    // static_castとreinterpret_castでは、
    // Array-to-pointer conversionは行われるものの、
    // cv-qualiferを消すことはできない
    char * ptr = static_cast< char * >("another idiots") ;
    char * ptr = reinterpret_cast< char * >("Yet another idiots") ;


    // well-formed
    // const_castでは、Array-to-pointer conversionが行われる。
    // const_castは、cv-qualiferを消すことができる。
    // 悪用厳禁、自己責任。
    char * ptr = const_cast< char * >("Real C++0x programmers who is at least understands C++0x well.") ;

最高だ。

2 comments:

批評家 said...

Visual C++ 2010 b2は/Wallでも警告すら出ない
さすがMicrosoftだ

hito said...

いや、これに関しては、一概にMSを責めるのもどうかと思います。
というのも、非constなポインタを文字列リテラルで初期化するというのは、
とても広く用いられているコードなのです。

警告メッセージというのが、そんなに頻繁に出されても、
プログラマは無視するだけです。
それなら、出さない方がマシなのです。