規格の内容
規格によると(18.2)
nullptr_tは次のように定義されます。
namespace std {
typedef decltype(nullptr) nullptr_t;
}
nullptr_tが同義語であるタイプには、3.9.1および4.10で説明されている特性があります。
3.9.1は基本的にと同じサイズである必要があると述べておりvoid*
、4.10はの変換ルールを指定していますnullptr
。
編集: 3.9.9はさらにnullptr_t
、それがスカラー型であることを明示的に示しています。これは、8.5以降の組み込み型に期待される初期化ルールが適用されることを意味します。
- Default-initialization(
nullptr_t n;
)。値はn
未定義のままです。Johannes Schaubが正しく指摘したように、これは最新バージョンのClangで正常にコンパイルされます。
nullptr_t n = nullptr_t();
nを0に初期化する値初期化( )。
この動作は、たとえばと同じであるint
ため、nullptr_t
デフォルトで構築可能です。nullptr_t
ここでの興味深い質問は、未定義の値を持つとはどういう意味ですか?結局のところ、の意味のある可能な値は1つだけです。nullptr_t
それはnullptr
です。さらに、型自体は、nullptr
リテラルのセマンティクスによってのみ定義されます。これらのセマンティクスは、単一化された値にも適用されますか?
その質問が実際には重要ではない理由
タイプの新しい変数を宣言する必要はありませんnullptr_t
。そのタイプの唯一の意味のあるセマンティクスは、nullptr
リテラルによってすでに表現されているため、タイプのカスタム変数を使用する場合はいつでも、を使用するnullptr_t
こともできますnullptr
。
実際には何が重要ですか
これに対する唯一の例外は、型の非型テンプレートパラメータをとることができるという事実から来ていますnullptr_t
。この場合、nullptr_t
4.10で説明されているに変換できる値を知ることは有用です。
ヌルポインタ定数は、整数型の整数型の整数型のprvalue(5.19)であり、ゼロまたは型のprvalueに評価されますstd::nullptr_t
。[...]整数型のnullポインタ定数は、型のprvalueに変換できますstd::nullptr_t
。
これは基本的にあなたが期待することをします:あなたは書くことができます
nullptr_t n = 0; // correct: 0 is special
だがしかし
nullptr_t n = 42; // WRONG can't convert int to nullptr_t
gcc4.6とClangSVNの両方がこれを正しく理解しています。