Что-то не понимаю, о каких исключениях идёт речь в
boost/math/quaternion.hpp:
quaternion<T> & operator *= (T const & rhs)
{
T at = a * rhs; // exception guard
T bt = b * rhs; // exception guard
T ct = c * rhs; // exception guard
T dt = d * rhs; // exception guard
a = at;
b = bt;
c = ct;
d = dt;
return(*this);
}
Чего они боятся?
Re: Вопрос про boost/math/quaternion.hpp и исключения
_>Что-то не понимаю, о каких исключениях идёт речь в _> boost/math/quaternion.hpp: _>Чего они боятся?
Так называемая exception safety. Если во время умножения выскочит исключение (так как тип T может быть любой, и его умножение может делать все что угодно) объект останется в предсказуемом состоянии (таким, каким оно было до начала операции, а не промежуточном).
Впрочем, непонятно, что они собираются делать если исключение бросит присваивание
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Вопрос про boost/math/quaternion.hpp и исключения
C>Поэтому вместо присваиваний там должен быть swap.
Если просто заменить присваивания свапом это не поможет — свап вполне может просить исключение, и объект останется полу-сконструированным. Надо весь код переписывать — создавать временный объект квартерион и свопить его с текущим.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: Вопрос про boost/math/quaternion.hpp и исключения
Здравствуйте, Vamp, Вы писали:
C>>Поэтому вместо присваиваний там должен быть swap. V>Если просто заменить присваивания свапом это не поможет — свап вполне может просить исключение, и объект останется полу-сконструированным. Надо весь код переписывать — создавать временный объект квартерион и свопить его с текущим.
Здравствуйте, Vamp, Вы писали:
__>>Обычно swap реализуется небросаяющим исключения. V>Это не всегда возможно.
Если для деталек нельзя реализовать небросающий swap, то и для агрегата нельзя реализовать небросающий swap. Разве что только запихать детальки под [хитрож#пый] указатель. Но, товарищи, вам не кажется, что хранить четыре коэффициента кватерниона под указателем — это немножечко бред и не соответствует принципу You Don’t Pay for What You Don’t Need?
Более логично сказать, что хэй, ребята, тип коэффициентов кватерниона должен быть DefaultConstructible, CopyConstructible, CopyAssignable, NofailSwappable, RealNumber, и не волнует. У кого swap не nofail, пусть сам обернётся в простыню хитрож#пый указатель.
Re[7]: Вопрос про boost/math/quaternion.hpp и исключения
C>Если для деталек нельзя реализовать небросающий swap, то и для агрегата нельзя реализовать небросающий swap. Разве что только запихать детальки под [хитрож#пый] указатель. Но, товарищи, вам не кажется, что хранить четыре коэффициента кватерниона под указателем — это немножечко бред и не соответствует принципу You Don’t Pay for What You Don’t Need?
Да я квартерионом вообще не пользуюсь, мне все равно Просто отметил, что существующая реализация бессмысленна.