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.") ;
最高だ。
2 comments:
Visual C++ 2010 b2は/Wallでも警告すら出ない
さすがMicrosoftだ
いや、これに関しては、一概にMSを責めるのもどうかと思います。
というのも、非constなポインタを文字列リテラルで初期化するというのは、
とても広く用いられているコードなのです。
警告メッセージというのが、そんなに頻繁に出されても、
プログラマは無視するだけです。
それなら、出さない方がマシなのです。
Post a Comment