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:
- Los punteros pueden ser nulos, las referencias no pueden. Esta es exactamente la diferencia que desea evitar con
std::optional
. - Los punteros se pueden redirigir para apuntar a otra cosa. Hazlo constante, y esa diferencia también desaparece.
- 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 proporcionastd::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 cvin_place_t
onullopt_t
está mal formado.