c++ - tipos - prototipo de funcion en c
¿Por qué as_const prohíbe los argumentos de valor? (3)
El problema es manejar la extensión de por vida.
const auto& s = as_const(getQString()); // Create dangling pointer
QChar c = s[0]; // UB :-/
Una posibilidad sería la siguiente sobrecarga (en lugar de la eliminada)
template< typename T >
const T as_const(T&& t) noexcept(noexcept(T(t)))
{
return t;
}
que involucra construcción adicional, y tal vez otras trampas.
Quería preguntar por qué as_const
prohíbe los argumentos de rvalor, de acuerdo con cppreference.com (es decir, por qué la gente de Standards lo hizo así, no por qué cppreference.com los citó específicamente. Y también no dónde está codificada la intención del comité , sólo para asegurarse :))). Este ejemplo (artificial) generaría un error (el usuario desea que sea constante para mantener el COW en silencio)
QChar c = as_const(getQString())[0];
La respuesta de otra pregunta indica que si eliminamos la eliminación de la sobrecarga de referencia de rvalue, transformaría silenciosamente los rvalues en lvalues. Correcto, pero ¿por qué no manejar rvalues con gracia y devolver const rvalues para rvalue input y const lvalues para lvalue input?
Porque as_const no toma el argumento como referencia constante. Las referencias de valores no constantes no pueden vincularse a los temporales.
La sobrecarga de referencia de reenvío se elimina explícitamente.
Una razón podría ser que podría ser peligroso en valores debido a la falta de transferencia de propiedad
for (auto const &&value : as_const(getQString())) // whoops!
{
}
y que podría no haber un caso de uso convincente para justificar el hecho de no tener en cuenta esta posibilidad.