4

重複の可能性:
nullptrとは正確には何ですか?

最初はキーワードだと思いました。nullptr私の現在のgccは別の色合いで強調表示されません。それを確認するために、私は次のように書いた:

void *&p = nullptr;

だから私はエラーからいくつかの手がかりを得ました:

エラー:タイプ'std ::nullptr_t'の右辺値からのタイプ'void*&'の非定数参照の無効な初期化</ p>

がオブジェクトの場合nullptr、それは本当に単純なものと同等のポインタ0ですか?言い換えれば、私が次のように書いたとしましょう。

#define NULL nullptr

上記のステートメントは私のコードの何も変更しませんか?また、タイプ自体の他のユースケースを知ることも興味深いでしょうstd::nullptr_t

4

5 に答える 5

10

これはキーワードであり、標準ドラフトには(lex.nullptr)と書かれています。

ポインタリテラルはキーワードnullptrです。これは、タイプstd::nullptr_tのprvalueです。

これnullptrはまだポインタではありませんが、ポインタ型に変換できます。これにより、関連のない参照型への割り当てである上記の割り当てが禁止されます。この場合、変換はできません(考慮してint& a = 1.f;ください!)。

を整数リテラルとして扱うことができないために機能しないなどのコンテキストで#define NULL nullptr使用した場合を除いて、動作を変更しないでください。NULLint i = 4; if(NULL == i) {}nullptrnullptr

他に多くのユースケースはないと思います。タイプが必要なstd::nullptr_tため、これは単なる番兵です。nullptr

于 2011-07-12T12:31:10.947 に答える
6

nullptrnullポインタ定数を表すキーワードです。これはタイプnullptr_tであり、暗黙的に変換可能であり、任意のポインター型またはポインターからメンバーへの型に匹敵します。

これらを読んで、

于 2011-07-12T12:33:39.887 に答える
4

nullptrは確かにキーワードであり、標準では、に基づいてオーバーロードを有効にするのstd::nullptr_tと同等の型が要求されています。typedef decltype(nullptr) nullptr_t;nullptr

于 2011-07-12T12:35:58.717 に答える
3

nullptr現在C++0xと呼ばれる次のC++標準のキーワードになります。

f(int)との間の曖昧性解消が必要なf(T*)ので、単に0ではなく、のnullptr_tです。

gccがコードを強調表示できることを知りませんでした;-)

于 2011-07-12T12:30:40.070 に答える
3

nullptr0整数オブジェクトではないのと同じように、オブジェクトではありません。前者は型のprvalue(つまり一種の式)でstd::nullptr_tあり、後者は型の整数リテラル(一種の式でありprvalueでもある)ですint

次のような式でオブジェクトを初期化することができます。

void* p = nullptr;
int i = 0;

これらはprvaluesであるため、このような式で左辺値参照を初期化することはできません。左辺値参照は、左辺値からのみ初期化できます。

void*& p = nullptr; // Invalid
int& i = 0; // Invalid
于 2011-07-12T12:40:25.913 に答える