7

dynamic_cast の結果を確認したい。c++11 (または nullptr をサポートするコンパイラの場合は c++0x) では、nullptr または 0 と比較する必要がありますか?

それは重要ですか? もしそうなら、それはなぜですか?

結果はコンパイラに依存しますか?

4

2 に答える 2

12

定数nullptr( 型nullptr_t) と定数の両方が、0暗黙的に任意のポインター型の null 値に変換されます。したがって、どちらと比較しても機能し、技術的には問題ありません。ちなみに、これはdynamic_castどちらも返さないことを意味し、特定のポインター型に対して null 値を返します。

nullptrではなく、使用する習慣を身につけるのがおそらく最善です0。私の知る限り、適切なオーバーロード解決のためにのみ必要です (たとえば、あるオーバーロード テイクintと別の テイクchar*)。一貫性を保つために、回避0するのが最善です。

「ポインタ型の null 値」とはどういう意味ですか?

変数を考えてみましょうchar * ptr。そのタイプは (当然のことながら)char *です。しかし、 の型nullptrは特別な型nullptr_tです。のようなものを書くときptr = nullptr、いくつかの技術的なことが起こらなければなりません

  1. nullptrに暗黙的に変換する必要がありますchar *
  2. この変換の結果が の新しい値として設定されます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
于 2013-05-16T15:10:44.757 に答える
5

ブール値のコンテキストで結果を評価します。

Base * p = get();

if (Derived * q = dynamic_cast<Derived *>(p))
{
    q->derived_method();
}
else
{
    // *p isn't of type Derived
}

(これは、C++ のどのバージョンでも機能します。)

于 2013-05-16T15:09:22.393 に答える