dynamic_cast の結果を確認したい。c++11 (または nullptr をサポートするコンパイラの場合は c++0x) では、nullptr または 0 と比較する必要がありますか?
それは重要ですか? もしそうなら、それはなぜですか?
結果はコンパイラに依存しますか?
dynamic_cast の結果を確認したい。c++11 (または nullptr をサポートするコンパイラの場合は c++0x) では、nullptr または 0 と比較する必要がありますか?
それは重要ですか? もしそうなら、それはなぜですか?
結果はコンパイラに依存しますか?
定数nullptr
( 型nullptr_t
) と定数の両方が、0
暗黙的に任意のポインター型の null 値に変換されます。したがって、どちらと比較しても機能し、技術的には問題ありません。ちなみに、これはdynamic_cast
どちらも返さないことを意味し、特定のポインター型に対して null 値を返します。
nullptr
ではなく、使用する習慣を身につけるのがおそらく最善です0
。私の知る限り、適切なオーバーロード解決のためにのみ必要です (たとえば、あるオーバーロード テイクint
と別の テイクchar*
)。一貫性を保つために、回避0
するのが最善です。
「ポインタ型の null 値」とはどういう意味ですか?
変数を考えてみましょうchar * ptr
。そのタイプは (当然のことながら)char *
です。しかし、 の型nullptr
は特別な型nullptr_t
です。のようなものを書くときptr = nullptr
、いくつかの技術的なことが起こらなければなりません
nullptr
に暗黙的に変換する必要がありますchar *
。ptr
。の null 値char *
は、 に変換nullptr
した結果ですchar *
。概念的には のままnullptr
ですが、タイプが異なります ( char *
)。int *
この null 値は、またはstring *
その他のポインター型の null 値とは異なります。nullptr
これらの null 値は単なる(または)と考える傾向がありますが0
、実際にはそれぞれが異なる型の個別の値です。(ちなみに、 を使った比較でも同様の変換が行われ==
ます)。
これは些細なことのように聞こえるかもしれませんが、過負荷の解決において非常に重要です。
void foo(char * ptr) { ... }
void foo(int i) { ... }
void foo(nullptr_t ptr) { ... }
int main()
{
foo(0); // Calls void foo(int), since 0 is an int
foo(nullptr); // Calls void foo(nullptr_t), since nullptr is a nullptr_t
foo(new char('c')); // Calls void foo(char *), since new char('c') is a char*
}
または無関係な null 値を割り当てる場合:
char * c_ptr = nullptr; // Okay
int * i_ptr1 = nullptr; // Okay
int * i_ptr2 = c_ptr; // COMPILER ERROR HERE
ブール値のコンテキストで結果を評価します。
Base * p = get();
if (Derived * q = dynamic_cast<Derived *>(p))
{
q->derived_method();
}
else
{
// *p isn't of type Derived
}
(これは、C++ のどのバージョンでも機能します。)