1. ホーム
  2. c++

[解決済み] nullptrとは一体何ですか?

2022-03-16 03:41:02

質問

C++11になり、多くの新機能が追加されました。その中でも興味深く、かつ混乱しそうなのが(少なくとも私にとっては)新しい nullptr .

これで、もう厄介なマクロは必要ありません。 NULL .

int* x = nullptr;
myclass* obj = nullptr;

それでも、私はどのように nullptr が動作します。例えば ウィキペディアの記事 は言う。

C++11ではこれを修正し、新たに キーワード は、区別されたヌルポインタ定数として機能します:nullptr。この定数は タイプ nullptr_t これは暗黙のうちにあらゆるポインタ型やポインタ-メンバ型に変換可能であり、比較可能である。bool 以外の整数型には暗黙のうちに変換されず,比較もできません.

キーワードと型のインスタンスはどうなっているのですか?

また、(ウィキペディアの例以外に)他の例はありますか? nullptr は、古き良き 0 ?

解決方法は?

<ブロッククオート

キーワードと型のインスタンスはどうなっているのですか?

これは意外と知られていない。どちらも truefalse はキーワードであり、リテラルとして型 ( bool ). nullptr ポインタ・リテラル 型の std::nullptr_t であり,prvalueである(prvalueのアドレスを取ることはできない). & ).

  • 4.10 ポインタ変換について、型の prvalue が std::nullptr_t はヌルポインター定数であり、積分のヌルポインター定数を std::nullptr_t . その逆は許されない。これにより,ポインタと整数の両方に対応する関数をオーバーロードし,その関数に nullptr でポインタのバージョンを選択します。渡すのは NULL または 0 を選択すると、紛らわしいので int のバージョンと同じです。

  • のキャストです。 nullptr_t を積分型に変換するには reinterpret_cast のキャストと同じセマンティクスを持ちます。 (void*)0 を積分型に変換します (マッピングの実装は定義されています)。A reinterpret_cast を変換することはできません。 nullptr_t を任意のポインタ型に変換することができます。可能であれば暗黙の変換に頼るか、あるいは static_cast .

  • 本規格では sizeof(nullptr_t) である sizeof(void*) .