C++ 名前付き要件: NullablePointer (C++11 以降)
この型が、std::nullptr_t オブジェクトと比較可能なポインタのようなオブジェクトであることを指定します。
目次 |
[編集] 要件
この型は、以下のすべての要件を満たす必要があります。
さらに、この型の値初期化されたオブジェクトは、その型のヌル値を生成しなければなりません。このヌル値は、それ自身と等価である場合にのみ等価でなければなりません。この型のデフォルト初期化は、不定またはエラー(C++26 以降) の値を持ちうる場合があります。
この型の値は、bool に文脈変換可能でなければなりません。この変換の効果は、値がヌル値と等価である場合は false を返し、そうでない場合は true を返します。
この型が行う操作のいずれも例外を投げないようにする必要があります。
この型は、型が p および q であり、np が std::nullptr_t 型の値である(const 修飾されている可能性もある)という条件下で、以下の追加の式を満たす必要があります。
| 宣言 | 効果 | ||||
| Type p(np);
Type p = np; |
その後、p は nullptr と等価になります。 | ||||
| Expression | 効果 | ||||
| Type(np) | nullptr と等価な一時オブジェクト | ||||
| p = np | Type& を返さなければならず、その後、p は nullptr と等価になります。 | ||||
| p != q |
効果は !(p == q) です。 | ||||
| p == np
np == p |
効果は (p == Type()) です。 | ||||
| p != np
np != p |
効果は !(p == np) です。 |
[編集] ノート
NullablePointer 型には、間接参照演算子(operator* または operator->)は必要ないことに注意してください。これらの要件を満たす最小限の型は次のとおりです。
class handle { int id = 0; public: handle() = default; handle(std::nullptr_t) {} explicit operator bool() const { return id != 0; } friend bool operator==(handle l, handle r) { return l.id == r.id; } friend bool operator!=(handle l, handle r) { return !(l == r); } // or only a defaulted operator== (since C++20) };
[編集] 標準ライブラリ
以下の型は NullablePointer を満たします。
標準ライブラリコンポーネントと通信するために、以下の型は NullablePointer を満たす必要があります。
- すべての Allocator 型
Xのメンバ型X::pointer、X::const_pointer、X::void_pointer、およびX::const_void_pointer。 - std::unique_ptr のメンバ型
pointer。
|
(C++23から) |
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 2114 (P2167R3) |
C++11 | bool への文脈変換は、実装の期待を反映するには弱すぎました。 |
要件が強化された |