una tipos son prototipos prototipo parametro los función funcion finalidad cuales cual argumentos argumento argumentar c++ rvalue c++17

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.