Допустим, у меня есть этот класс исключения:
struct MyException : public std::exception
{
MyException(const std::exception &exc) : std::exception(exc)
{
cout << "lval\n";
}
MyException(std::exception &&exc) : std::exception(std::forward(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(rValRef));
}
Когда я пытался поймать по значению или по ( const ) lvalue ref. компилятор говорит, что эти случаи уже обрабатываются предложением rvalue ref catch
, что понятно, поскольку исключением является xvalue , и, возможно, лучший способ поймать xvalue - это rvalue ref (поправьте меня если я ошибаюсь). Но может ли кто-нибудь объяснить идеальную пересылку в приведенном выше случае создания исключения? Это правильно? Даже если он компилируется, является ли он значимым или полезным? Если в используемой мной библиотеке C ++ реализован конструктор перемещения для его std :: исключение
, чтобы такое использование было действительно значимым? Я попытался найти статьи и SO-вопросы по ссылкам на rvalue в отношении исключений, но ничего не нашел.