Digamos que tengo esta clase de excepción:¿Alguien puede explicar las referencias de valor r con respecto a las excepciones?
struct MyException : public std::exception
{
MyException(const std::exception &exc) : std::exception(exc)
{
cout << "lval\n";
}
MyException(std::exception &&exc) : std::exception(std::forward<std::exception>(exc))
{
cout << "rval\n";
}
};
...
...
try
{
throw std::exception("Oh no!");
// above is rvalue since it's got no name, what if the throw is made as
// std::exception lvalExc("Oh wierd!");
// throw lvalExc;
// if the throw is made thus, how can it be caught by catch(std::exception &&exc)?
}
catch(std::exception &&rValRef)
{
cout << "rValRef!\n";
throw MyException(std::forward<std::exception>(rValRef));
}
Cuando intenté coger por valor o por (const ) ref lvalue. el compilador dice que estos casos ya están manejados por la cláusula rvalue ref catch
, lo cual es comprensible, ya que una excepción es un xvalue y quizás la mejor forma de capturar un valor x es una referencia rvalue (corríjame si estoy equivocado). Pero, ¿alguien puede explicar sobre el perfect forwarding en el caso anterior de creación de excepciones? ¿Es correcto? Aunque compila, ¿es significativo o útil? ¿Debería la biblioteca C++ que uso tener un constructor de movimiento implementado para su std::exception
para que este tipo de uso sea realmente significativo? Traté de buscar artículos y SO preguntas sobre referencias rvalue con respecto a excepciones, no pude encontrar ninguna.
+1: Usted dice lo que dije, pero más y mejor. Además, solo para hacer explícito el consejo, una referencia simple no const coincidirá y podrá modificar el objeto de excepción. – Potatoswatter
@Potatoswatter: Perdón por repetir la mitad de tu respuesta. De hecho, me perdí tu referencia al 15.1/3 cuando revisé tu respuesta. – sellibitze
@sellibitze: No tiene sentido que sean mutuamente excluyentes. Puede pedir prestado cualquier cosa siempre que su respuesta sea correcta: v). – Potatoswatter