Namespaces
Variants

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

From cppreference.net
C++ named requirements

Especifica que el tipo es un objeto similar a un puntero que puede compararse con objetos std::nullptr_t .

Contenidos

Requisitos

El tipo debe cumplir con todos los siguientes requisitos:

Además, un objeto inicializado por valor del tipo debe producir un valor nulo de ese tipo. Este valor nulo solo debe ser equivalente a sí mismo. La inicialización por defecto del tipo puede tener un valor indeterminado o erróneo (since C++26) .

Un valor del tipo debe ser contextualmente convertible a bool . El efecto de esta conversión devuelve false si el valor es equivalente a su valor nulo y true en caso contrario.

Ninguna de las operaciones que este tipo realiza puede lanzar excepciones.

El tipo debe satisfacer las siguientes expresiones adicionales, dados dos valores p y q que son del tipo, y que np es un valor de tipo std::nullptr_t (posiblemente calificado con const):

Declaración Efectos
Type p ( np ) ;

Type p = np ;

Posteriormente, p es equivalente a nullptr
Expresión Efectos
Type ( np ) Un objeto temporal que es equivalente a nullptr
p = np Debe retornar un Type& , y posteriormente, p es equivalente a nullptr
p ! = q

El tipo y valor cumplen con los requisitos BooleanTestable

(hasta C++20)

decltype ( p ! = q ) modela boolean-testable

(desde C++20)

El efecto es ! ( p == q )

p == np

np == p


El tipo y valor de ambas expresiones cumplen los requisitos BooleanTestable

(hasta C++20)

decltype ( p == np ) y decltype ( np == p ) modelan cada uno boolean-testable

(desde C++20)

El efecto es ( p == Type ( ) )

p ! = np

np ! = p


El tipo y valor de ambas expresiones cumplen los requisitos BooleanTestable

(hasta C++20)

decltype ( p ! = np ) y decltype ( np ! = p ) modelan cada uno boolean-testable

(desde C++20)

El efecto es ! ( p == np )

Notas

Tenga en cuenta que la desreferenciación ( operator * o operator - > ) no es requerida para un tipo NullablePointer . Un tipo minimalista que satisface estos requisitos es

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); }
    // o solo un operator== por defecto (desde C++20)
};

Biblioteca estándar

Los siguientes tipos satisfacen NullablePointer :

Los siguientes tipos deben satisfacer NullablePointer para poder comunicarse con componentes de la biblioteca estándar:

  • Los tipos miembro X::pointer , X::const_pointer , X::void_pointer y X::const_void_pointer de cada tipo Allocator X .
  • El tipo miembro pointer de std::unique_ptr .
(desde C++23)

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2114
( P2167R3 )
C++11 la convertibilidad contextual a bool era demasiado débil para reflejar las expectativas de las implementaciones requisitos fortalecidos