¿Por qué GCC rechaza std :: opcional para referencias?

std::optional xx; simplemente no comstack para la última instantánea de gcc-7.0.0. ¿El estándar C ++ 17 incluye std::optional para referencias? ¿Y por qué si no? (La implementación con punteros en una especialización dedicada no debería causar problemas, supongo).

Debido a que optional , como está estandarizado en C ++ 17, no permite tipos de referencia. Esto fue excluido por diseño.

Hay dos razones para esto. La primera es que, estructuralmente hablando, un optional es equivalente a un T* . Pueden tener diferentes interfaces, pero hacen lo mismo.

La segunda cosa es que efectivamente no hubo consenso por parte del comité de estándares sobre cuestiones de cómo debería comportarse exactamente optional .

Considera lo siguiente:

 optional ot = ...; T t = ...; ot = t; 

¿Qué debería hacer esa última línea? ¿Está tomando el objeto al que hace referencia ot y copy-asignar a él, de manera que *ot == t ? ¿O debería volver a enlazar la propia referencia almacenada, de modo que ot.get() == &t ? Peor aún, ¿ hará cosas diferentes en función de si ot se comprometió o no antes de la asignación?

Algunas personas esperan que haga una cosa, y otras esperan que haga otra. Así que no importa de qué lado escojas, alguien se va a confundir.

Si hubiera usado un T* lugar, sería bastante claro lo que sucede:

 T* pt = ...; T t = ...; pt = t; //Compile error. Be more specific. *pt = t; //Assign to pointed-to object. pt = &t; //Change pointer. 

En [opcional]:

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

No hay std::optional . Por ahora, tendrás que usar std::optional> .