Именованные требования C++: NullablePointer (начиная с C++11)
Задает тип как объект, подобный указателю, который можно сравнивать с объектами std::nullptr_t.
Требования
Тип должен удовлетворять всем следующим требованиям:
Кроме того, объект типа, инициализированный значением, должен иметь нулевое значение этого типа. Это нулевое значение должно быть эквивалентно только самому себе. При инициализации типа по умолчанию может получиться неопределенное или ошибочное(начиная с C++26) значение.
Значение типа должно контекстно преобразовываться в bool. В результате этого преобразования возвращается false, если значение эквивалентно своему нулевому значению, и true в противном случае.
Ни одна из операций, выполняемых этим типом, не должна генерировать исключения.
Тип должен удовлетворять следующим дополнительным выражениям, если даны два значения p и q этого типа, а np — значение типа std::nullptr_t (возможно, константного):
| Объявление | Эффект | ||||
|---|---|---|---|---|---|
Type p(np);
| После этого p эквивалентно nullptr |
||||
| Выражение | Эффект | ||||
Type(np) | Временный объект, эквивалентный nullptr |
||||
p = np | Должно возвращать Type&, а после этого p эквивалентно nullptr |
||||
p != q |
Эффект: |
||||
p == np
|
Эффект: |
||||
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:
Следующие типы должны удовлетворять требованиям NullablePointer для взаимодействия с компонентами стандартной библиотеки:
- Типы-члены
X::pointer,X::const_pointer,X::void_pointerиX::const_void_pointerкаждого типа AllocatorX. - Тип-член
pointerтипаstd::unique_ptr.
| (начиная с C++23) |
Отчеты об ошибках
Следующие отчеты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Применяется к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
|
LWG 2114 (P2167R3) | C++11 | контекстной преобразуемости в bool было недостаточно для отражения ожиданий реализаций | требования усилены |
См. также
|
(C++11)(DR*) | проверяет, является ли тип std::nullptr_t (шаблон класса) |
|
(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