2016-06-20 4 views
-1

nullptrの種類は何ですか?私はこの質問を読んでいた

変数のchar *のPTRを考えてみましょう:

In c++11, does dynamic_cast return nullptr or 0?

私はdynamic_castをした結果は、その特定の型のNULL値ができることを学びました。それは(驚くことではない)char *です。 しかし、nullptrの型は特別な型nullptr_tです。したがって、我々が のようなものを書くと、ptr = nullptrのようなものを書いてください。いくつかの技術的なことが起こらなければなりません。

nullptrは暗黙的にchar *に変換されなければなりません。この の変換結果がptrの新しい値として設定されます。 char * のnull値は、nullptrをchar *に変換した結果です。概念的には、それはまだ ですが、異なるタイプ(char *)のnullptrです。このnull値は、int *またはstring *または他のポインタ 型のnull値とは異なる です。これらのヌル値はnullptr(または0)の と考える傾向がありますが、それぞれが実際には異なるタイプの別個の値です。 ( の方法では、==を使って比較すると同じ変換が行われます)。

異なるヌルポインタの種類は何ですか?それは本当に重要ですか?任意のチェック(何かがヌルかどうかを確認したいところ)で、単に==がstd :: nullptrになっているかどうかをチェックするだけで十分ですか?

+1

'異なるヌルポインタ型は何ですか?あなたの見積もりではポインタ型なので、意味がありません。すべてのポインタ型にはNULL値があります。 – deviantfan

+0

'単純に== std :: nullptr'をチェックします。私が何かを見逃していない限り、C++の型は' == 'と直接比較できません。 'char *'または 'int *'は決してnullptr_tと同じではありません – deviantfan

+1

'nullptr'はキーワードなので' std'名前空間にはありません。その型だけ、 'std :: nullptr_t'が名前空間にあります。 –

答えて

3

nullptrタイプはありません。 nullptrは、タイプstd::nullptr_tの値です。異なるポインタ型があり、いずれのポインタ型もNULL値を持つことができます。nullptrと比較すると、trueになります。そして、ポインタ型の数は無限です。任意の型へのポインタを形成することができるので、結果自体はポインタを形成できる型です。 (すなわち、あなたはint*************************を持つことができます)

それは==ではstdする場合、単純にチェックするために:: nullptrを(私たちは何か がnullであるかどうかを判断したい)いずれかのチェックで十分ですか?

std::nullptr、ちょうどnullptrです。しかしそうでなければ、はい。だから、

+0

したがって、nullptrと比較すると、C++はポインタがヌルポインタであるかどうかをチェックしますが、実際にはそれを型と比較していませんか? –

+0

@John:最初の人にはうってつけです.2番目の人が何を意味するのかよく分かりません。 –

+0

無限の数の型があり、nullptrと==比較を行っていますが、同時にnullptrが型ではなくキーワードである場合、実際に型と比較していません。オブジェクトが概念的にnullに等しいかどうかをチェックします。あれは正しいですか ? –

2

異なるヌルポインタ型は何ですか?

ヌルポインタタイプが1つあるのは、nullptr_tです。

それは本当に重要ですか?

nullポインタのタイプは1つだけなので、この質問は問題です。

==〜std::nullptrかどうかを確認するだけで、何らかのチェック(何かがnullであるかどうか確認したい場所)で十分ですか?

std::nullptrのようなものはありませんnullptrはキーワードです。 std::nullptr_tの値です。

はい、どのポインタもnullptrと比較できます。

2

std::nullptr_tがあります。ポインタ型ではありません。この事実にもかかわらず、私たちはこの型のインスタンス(例えば、nullptr)を "nullポインタ定数"と呼びます。

すべてのタイプがTの場合、T*は異なるポインタタイプであり、このタイプのヌルポインタがあります。

nullptr_tからヌルポインタ定数が必要なときはいつでもnullptrを使用できる任意のポインタ型への適切な変換があります。例えば

int *ptr = nullptr; // initialize to be the null pointer of type int* 
関連する問題