トップページ – Modern C++編 C++編](../../index.html) – 第9章
問題① 次の各変換は、static_cast、const_cast、reinterpret_cast、C言語形式のキャスト、キャストは不要、のいずれで行えるか答えてください。
暗黙的に変換できますが、大きさが小さくなると元の値が表現できない可能性があるため、ほとんどのコンパイラでは警告が出ます。 static_cast か、C言語形式のキャストで、問題がないことを明示できます。 C++ では static_cast を使いましょう。
キャストは不要です。 true なら 1 に、false なら 0 になります。
reinterpret_cast か、C言語形式のキャストが使えます。 C++ では reinterpret_cast を使いましょう。
const_cast か、C言語形式のキャストが使えます。 C++ では const_cast を使いましょう。
あるポインタ型から void*型へは、暗黙的に変換できますから、キャストは不要です。
const修飾子を付ける方向へは、暗黙的に変換できますから、キャストは不要です。
static_cast、reinterpret_cast、C言語形式のキャストのいずれでも可能です。 C++ では static_cast を使いましょう。
C言語形式のキャストを使えば一気に変換できますが、 C++ では reinterpret_cast と const_cast を併用して書くべきです。
int* p2 = reinterpret_cast<int*>(const_cast<float*>(f));
reinterpret_cast か、C言語形式のキャストが使えます。 C++ では static_cast を使いましょう。
書き方が分かりにくいので、例を挙げておきます。
#include <iostream>
bool func(int a)
{
return true;
}
int main()
{
bool (*p1)(int) = func;
// bool (*p2)(const char*) = (bool (*)(const char*))p1;
bool (*p2)(const char*) = reinterpret_cast<bool (*)(const char*)>(p1);
std::cout << p2("abc") << std::endl;
}
実際のところ、関数ポインタの型は分かりづらいので、 using で別名を用意する方が良いでしょう。
#include <iostream>
using func_int = bool (*)(int);
using func_cchar_ptr = bool (*)(const char*);
bool func(int a)
{
return true;
}
int main()
{
= func;
func_int p1 // func_cchar_ptr p2 = (func_cchar_ptr)p1;
= reinterpret_cast<func_cchar_ptr>(p1);
func_cchar_ptr p2
std::cout << p2("abc") << std::endl;
}
ただし、キャストができるからといって、安全に使えるかどうかは別問題なので注意してください。 たとえば、このサンプルプログラムにおいては、p2 に代入した関数ポインタは本来、int型が引数の関数を指していますから、 p2(“abc”) のように文字列を渡しても、正常に動作することはないでしょう。
新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |