c++ c++11 stl optional boost-optional

c++ - std:: especialización opcional para tipos de referencia



c++11 stl (3)

¿Por qué std::optional ( std::experimental::optional en libc ++ en este momento) no tiene especialización para los tipos de referencia (en comparación con boost::optional )?

Creo que sería una opción muy útil.

¿Hay algún objeto con referencia a la semántica de objetos ya existente en STL ?


Cuando se n3406 (revisión # 2 de la propuesta), algunos miembros del comité se sintieron incómodos con referencias opcionales. En n3527 (revisión # 3), los autores decidieron hacer referencias opcionales en una propuesta auxiliar, para aumentar las posibilidades de obtener la aprobación de valores opcionales y colocarlos en lo que se convirtió en C ++ 14. Si bien opcional no llegó a C ++ 14 por varias otras razones, el comité no rechazó las referencias opcionales y es libre de agregar referencias opcionales en el futuro si alguien lo propone.


De hecho, hay algo que tiene referencia a la semántica de objetos tal vez existentes . Se llama un puntero (const). Un simple y no puntero puntero. Hay tres diferencias entre referencias y punteros:

  1. Los punteros pueden ser nulos, las referencias no pueden. Esta es exactamente la diferencia que desea evitar con std::optional .
  2. Los punteros se pueden redirigir para apuntar a otra cosa. Hazlo constante, y esa diferencia también desaparece.
  3. Las referencias no necesitan ser referenciadas por -> o * . Esto es puro azúcar sintáctico y es posible debido a 1. Y la sintaxis del puntero (desreferenciación y conversión a bool) es exactamente lo que proporciona std::optional para acceder al valor y probar su presencia.

Actualización: optional es un contenedor para valores. Al igual que otros contenedores ( vector , por ejemplo), no está diseñado para contener referencias. Si desea una referencia opcional, use un puntero, o si de hecho necesita una interfaz con una sintaxis similar a std::optional , cree una envoltura pequeña (y trivial) para los punteros.

Actualización 2: En cuanto a la pregunta de por qué no existe tal especialización: porque el comité simplemente la rechazó . La razón podría encontrarse en algún lugar de los periódicos. Posiblemente sea porque consideraron que los punteros son suficientes.


Si me arriesgo a adivinar, sería debido a esta oración en la especificación de std :: experimental :: opcional. (Sección 5.2, p1)

Un programa que necesita la creación de instancias de la plantilla optional para un tipo de referencia, o para los tipos posiblemente calificados para cv in_place_t o nullopt_t está mal formado.