Spec-Zone.ru › C++

Именованные требования C++: NullablePointer (начиная с C++11)

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

Требования

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

  • EqualityComparable
  • DefaultConstructible
  • CopyConstructible
  • CopyAssignable
  • Swappable
  • Destructible

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

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

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

Тип должен удовлетворять следующим дополнительным выражениям, если даны два значения p и q этого типа, а np — значение типа std::nullptr_t (возможно, константного):

Объявление Эффект
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); }
    // or only a defaulted operator== (since C++20)
};

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

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

  • std::exception_ptr.

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

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

Отчеты об ошибках

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

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

См. также

is_null_pointer
(C++11)(DR*)
проверяет, является ли тип std::nullptr_t
(шаблон класса)
is_null_pointer_type
(C++26)
проверяет, является ли отраженный тип std::nullptr_t
(функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/NullablePointer

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API