C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: sitatic_castが使えない場合


(過去ログ 114 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■67605 / inTopicNo.1)  sitatic_castが使えない場合
  
□投稿者/ OROCHI (1回)-(2013/08/14(Wed) 12:51:23)

分類:[C/C++] 

環境
OS:Windows 8
開発:Visual Studio 2010

こんにちは。現在学習もかねて以下のような自前のstrcmpを作成しようとしているのですが、なぜか引数をキャストしようとするとstatic_castのところが無効な型変換ですと出てコンパイルが通せません
この原因がわかる方、いらっしゃいますでしょうか?

enum CStringOrder
{
FirstBeforeSecond = -1,
Same = 0,
SecondBeforeFirst = 1
};

CStringOrder strcmp(char const *first,char const *second)
{
assert(first && second);
unsigned char const *f = static_cast<unsigned char const*>(first); // ここのstatic_castでエラー
unsigned char const *s = static_cast<unsigned char const*>(second); // ここのstatic_castでエラー
do
{
if((*f) < (*s))
{
return FirstBeforeSecond;
}
else if((*s) < (*f))
{
return SecondBeforeFirst;
}
}
while(*(s++) && *(f++));
assert((*s-1)==0 && (*(f-1)==0));
return Same;
}
引用返信 編集キー/
■67606 / inTopicNo.2)  Re[1]: sitatic_castが使えない場合
□投稿者/ επιστημη (77回)-(2013/08/14(Wed) 18:44:56)
επιστημη さんの Web サイト
ここは reinterpret_cast ぢゃねぇですかしら。

引用返信 編集キー/
■67607 / inTopicNo.3)  Re[2]: sitatic_castが使えない場合
□投稿者/ 774RR (100回)-(2013/08/14(Wed) 19:46:55)
「なぜ」の根拠を挙げろとなると、それはもう言語規格書に拠るしかないわけだが
そういう厳密な話が本当にしたいのかしらん?

とりあえず JIS X 3014:2003 や ISO/IEC 14882:1998 によると
5.2.9 static_cast の第2項
static_cast<T>(e) は、一時的変数 t を導入して T t(e); が適格な場合に式 e を型 T に変換できる。
3.9.1 基本型
単なる char と unsigned char と signed char は3つの別の型である。
4.10 ポインタ変換
無関係な型である char* → unsigned char* に暗黙変換してよいという規則はない。

ことから static_cast<unsigned char const*>( char const* な式 ) はできねぇ、ってことだ。

回避策は既にあるとおり reinterpret_cast だろう。
5.2.10 reinterpret_cast の第7項にそういう旨書いてある(変換結果は未規定だが)

引用返信 編集キー/
■67608 / inTopicNo.4)  Re[3]: sitatic_castが使えない場合
□投稿者/ OROCHI (2回)-(2013/08/15(Thu) 10:06:04)
reinterpret_castで無事解決できました
ありがとうございます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -