Namespaces
Variants

C++ named requirements: NullablePointer (since C++11)

From cppreference.net
C++ named requirements

型が std::nullptr_t オブジェクトと比較可能なポインタライクなオブジェクトであることを指定します。

目次

要件

型は以下のすべての要件を満たさなければなりません:

さらに、その型の値初期化されたオブジェクトは、その型の null 値を生成しなければならない。この null 値は自身とのみ等価でなければならない。その型のデフォルト初期化は 不定値 または誤った値 (C++26以降) を持つ可能性がある。

型の値は contextually convertible でなければならず、 bool に変換可能であること。この変換の効果は、値がそのnull値と等価な場合は false を返し、それ以外の場合は true を返す。

この型が実行する操作のいずれも例外をスローしてはなりません。

型は、その型の2つの値 p q が与えられ、かつ np std::nullptr_t 型(const修飾されている可能性あり)の値である場合、以下の追加の式を満たさなければならない:

宣言 効果
Type p ( np ) ;

Type p = np ;

その後、 p nullptr と等価になる
効果
Type ( np ) nullptr と等価な一時オブジェクト
p = np Type& を返さなければならず、その後 p nullptr と等価になる
p ! = q

型と値が BooleanTestable 要件を満たす

(C++20まで)

decltype ( p ! = q ) boolean-testable をモデル化する

(C++20以降)

効果は ! ( p == q )

p == np

np == p


両方の式の型と値が BooleanTestable 要件を満たす

(C++20まで)

decltype ( p == np ) decltype ( np == p ) がそれぞれ boolean-testable をモデル化する

(C++20以降)

効果は ( p == Type ( ) )

p ! = np

np ! = p


両方の式の型と値が BooleanTestable 要件を満たす

(C++20まで)

decltype ( p ! = np ) decltype ( np ! = p ) がそれぞれ boolean-testable をモデル化する

(C++20以降)

効果は ! ( 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); }
    // または C++20 以降ではデフォルト化された operator== のみ
};

標準ライブラリ

以下の型は 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 への文脈的変換可能性が実装の期待を反映するには弱すぎた 要件が強化された