Subject: Re: [boost] [rational] Inadvertent construction from double
From: John Maddock (boost.regex_at_[hidden])
Date: 2014-07-25 11:13:38
> I have encountered something I consider a bug in boost::rational's
> interface. Its documentation discusses in detail why conversion from double
> is not supported, but the following code works fine:
> #include <iostream>
> #include <boost/rational.hpp>
> int main()
> double d = 31.82;
> boost::rational<int> r = d;
> std::cout << r << std::endl;
> With the following result:
> It just discards the fractional part. Such conversion is really confusing
> an I claim should be explicitly deleted.
It should indeed be prohibited and not proceed via an implicit
conversion. It's probably an easy fix via enable/disable_if as well.
Note that the Boost.Multiprecision rational classes *do* allow implicit
construction from floating point values since these are actually exact
conversions when correctly written (this is a new change in response to
a bug report - will be in the next release). So there's a discrepancy
there. However, rational<int> doesn't have enough bits to do such a
conversion correctly, so I guess it's maybe safer to forbid it in that case?
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk