c++ - ¿Por qué debería<T &> rebindir opcionalmente en la asignación?
reference optional (1)
¿Cuál es el argumento de que opt = j debe volver a enlazar la referencia subyacente?
No sé qué es el "argumento" que estás buscando. Pero acabas de presentar "un argumento" para ello:
optional<T&> opt;
opt = i;
opt = j;
Ahora, simule que las líneas segunda y tercera están alejadas una de la otra. Si solo estás leyendo el código, ¿qué esperas que haga opt = j
? O más al punto, ¿por qué esperarías que su comportamiento difiera de opt = i
?
Para que el comportamiento de un tipo de envoltorio difiera de forma tan drástica, basarse únicamente en su estado actual sería muy sorprendente.
Además, ya tenemos una forma de comunicar que desea cambiar el valor dentro de lo optional
. A saber: *opt = j
. Esto funciona igual de bien para optional<T&>
optional<T>
como para optional<T>
.
La forma en que funciona optional
es muy simple: es un tipo de envoltura. Al igual que con cualquier tipo de envoltorio existente, las operaciones en ellos afectan al envoltorio , no a la cosa que se envuelve. Para afectar a la cosa que se está envolviendo, explícitamente usa *
o ->
o alguna otra función de interfaz.
Hay un debate en curso sobre qué optional
y variant
deberían hacer con los tipos de referencia, particularmente con respecto a la asignación. Me gustaría entender mejor el debate sobre este tema.
optional<T&> opt;
opt = i;
opt = j; // should this rebind or do i=j?
Actualmente, la decisión es hacer que optional<T&>
sea optional<T&>
incorrecto y hacer variant::operator=
mal formado si alguno de los tipos es un tipo de referencia, para eludir el argumento y seguir brindándonos la mayor parte de la funcionalidad.
¿Cuál es el argumento de que opt = j
debe volver a enlazar la referencia subyacente? En otras palabras, ¿por qué deberíamos implementar optional
esta manera:
template <class T>
struct optional<T&> {
T* ptr = nullptr;
optional& operator=(T& rhs) {
ptr = &rhs;
return *this;
}
};