75 :デフォルトの名無しさん:2010/01/15(金) 19:30:19
char *p = "hello world!";
このクソ変換N3000で無くなったんだな
良いことだ
はて、そうだっただろうか。気になったので調べてみた。
たしか、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.") ;
最高だ。
Visual C++ 2010 b2は/Wallでも警告すら出ない
ReplyDeleteさすがMicrosoftだ
いや、これに関しては、一概にMSを責めるのもどうかと思います。
ReplyDeleteというのも、非constなポインタを文字列リテラルで初期化するというのは、
とても広く用いられているコードなのです。
警告メッセージというのが、そんなに頻繁に出されても、
プログラマは無視するだけです。
それなら、出さない方がマシなのです。