Namespaces
Variants

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

From cppreference.net
C++ named requirements

Указывает, что тип является указатель-подобным объектом, который можно сравнивать с объектами std::nullptr_t .

Содержание

Требования

Тип должен соответствовать всем следующим требованиям:

**Примечание:** Все термины C++ (EqualityComparable, DefaultConstructible, CopyConstructible, CopyAssignable, Swappable, Destructible) оставлены без перевода в соответствии с требованиями, так как они являются стандартными названиями концепций/требований в языке C++.

Кроме того, объект этого типа, инициализированный значением, должен создавать нулевое значение данного типа. Это нулевое значение должно быть эквивалентно только самому себе. Стандартная инициализация типа может иметь неопределённое или ошибочное (since C++26) значение.

Значение типа должно быть контекстно преобразуемо в bool . Результат этого преобразования возвращает false если значение эквивалентно своему нулевому значению и true в противном случае.

Ни одна из операций, выполняемых этим типом, не может вызывать исключения.

Тип должен удовлетворять следующим дополнительным выражениям, при условии двух значений 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 )

Примечания

Обратите внимание, что разыменование ( operator * или operator - > ) не требуется для типа NullablePointer . Минималистичный тип, удовлетворяющий этим требованиям, это

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)
};

Стандартная библиотека

Следующие типы удовлетворяют требованиям NullablePointer :

Следующие типы должны удовлетворять требованиям NullablePointer для взаимодействия с компонентами стандартной библиотеки:

  • Типы-члены X::pointer , X::const_pointer , X::void_pointer и X::const_void_pointer каждого Allocator типа X .
  • Тип-член pointer класса std::unique_ptr .
(начиная с C++23)

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены задним числом к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 2114
( P2167R3 )
C++11 контекстуальная преобразуемость в bool была слишком слабой для отражения ожиданий реализаций требования усилены