C++ named requirements: NullablePointer (since C++11)
Указывает, что тип является указатель-подобным объектом, который можно сравнивать с объектами 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 |
Эффект: ! ( p == q ) |
||||
|
p
==
np
np == p |
Эффект: ( p == Type ( ) ) |
||||
|
p
!
=
np
np ! = p |
Эффект: ! ( 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 была слишком слабой для отражения ожиданий реализаций | требования усилены |