Bu istisna sınıfını kullandığımı söyleyelim:Birisi istisnalara ilişkin referans referanslarını açıklayabilir mi?
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));
}
Değer yakalamaya çalıştığımda ( const) lvalue ref. derleyici, bu durumların rzue ref catch
tarafından ele alındığını, bunun anlaşılabilir bir durum olduğunu çünkü bir istisnanın xvalue olduğunu ve belki de bir xvalue yakalamanın en iyi yolunun bir rıhtım ref (yanlışsa beni düzelt) olduğunu söyledi. Ama birisi yukarıdaki istisna oluşturma durumunda perfect forwarding hakkında açıklayabilir? Doğru mu? Derleme yapsa da, anlamlı mı yoksa yararlı mıdır? Kullandığım C++ kitaplığı, std::exception
için bu tür bir kullanım için gerçekten hareket eden bir hareket yapıcıya sahip olmalı mı? İstisnalarla ilgili rvalue referanslar hakkında makaleler ve SO soruları aramayı denedim, bulamadım.
+1: Söylediğimi söylüyorsun ama daha çok ve daha iyi. Ayrıca, yalnızca tavsiyeyi açıkça belirtmek için, düz bir const olmayan başvuru eşleşir ve istisna nesnesini değiştirebilir. – Potatoswatter
@Potatoswatter: Cevabınızın yarısını tekrar ettiğim için üzgünüm. Cevabınızı gözden geçirdiğimde 15.1/3'e referansınızı kaçırdım. – sellibitze
@sellibitze: Onları karşılıklı olarak münhasır hale getirmenin bir anlamı yok. Cevabınız doğru olduğu sürece herhangi bir şeyi ödünç almakta özgürsünüz: v). – Potatoswatter