Может ли кто-нибудь объяснить ссылки на rvalue в отношении исключений?

Допустим, у меня есть этот класс исключения:

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 в отношении исключений, но ничего не нашел.

9
задан Community 23 May 2017 в 00:29
поделиться