Lets sagen, dass ich diese Ausnahmeklasse haben:Kann jemand Rvalue-Referenzen in Bezug auf Ausnahmen erklären?
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));
}
Als ich versuchte, nach Wert oder (const) lvalue ref zu fangen. Der Compiler sagt, dass diese Fälle bereits von der Klausel rvalue ref catch
behandelt werden, was verständlich ist, als Ausnahme ist eine xvalue und vielleicht ist der beste Weg, einen xvalue zu fangen, ein rvalue ref (korrigiere mich, wenn ich falsch liege). Aber kann jemand über die perfect forwarding im obigen Fall der Ausnahmeerstellung erklären? Ist es richtig? Obwohl es kompiliert, ist es sinnvoll oder nützlich? Sollte die C++ - Bibliothek, die ich verwende, einen Move-Konstruktor implementiert haben, der für diese Art von Verwendung std::exception
implementiert ist, um wirklich sinnvoll zu sein? Ich habe versucht, nach Artikeln und SO-Fragen zu rvalue-Referenzen in Bezug auf Ausnahmen zu suchen, konnte keine finden.
+1: Sie sagen, was ich gesagt habe, aber mehr und besser. Um nur den Hinweis explizit zu machen, wird eine einfache nicht-konstante Referenz übereinstimmen und in der Lage sein, das Ausnahmeobjekt zu modifizieren. – Potatoswatter
@Potatoswatter: Entschuldigung für die Wiederholung der Hälfte Ihrer Antwort. Ich habe deinen Hinweis auf 15.1/3 wirklich vermisst, als ich deine Antwort überflogen habe. – sellibitze
@sellibitze: Es macht keinen Sinn, sie gegenseitig auszuschließen. Sie können nichts ausleihen, solange Ihre Antwort richtig ist: v). – Potatoswatter