gmpxx implicit conversion between types
Marc Glisse
marc.glisse at inria.fr
Tue Mar 8 18:46:48 CET 2011
On Tue, 8 Mar 2011, Torbjorn Granlund wrote:
> Ok, should we allow any implicit conversions between GMP types? I think
> C's type conversions are actively harmful, but C++ has done some cleanup
> in this area with which I am only vaguely.
>
> When dealing with "heavy" types like these, is it in the C++ spirit to
> allow implicit conversions? Will we do any good by disallowing them?
I would say that the C++ spirit is to allow "safe" and natural conversions
to happen implicitly for interoperability purposes. For instance:
void f(std::string);
f("hello"); // a std::string is safely constructed with a copy of "hello"
MyInt operator+(MyInt a,MyInt b);
a+3; // a MyInt is constructed from 3 and added to a
On the other hand, it requires an explicit conversion for unsafe or
unexpected conversions:
creating an exception from a string (containing the error message), or a
locale from a string (containing the name of the locale), etc
creating a smart pointer from a regular pointer
build a string from an allocator or a length
(you probably see the pattern, building an object vs converting)
A nice example in C++0X:
std::complex<float> -> std::complex<double> -> std::complex<long double>
conversions are implicit towards the right, and explicit towards the left.
Still in C++0X mode:
int i;
short s{i}; // error, narrowing conversion
>From all these examples, it looks like between mpX and mpY there should be
an implicit conversion in a direction and an explicit one in the other
direction. The implicit direction being consistent with the return type of
mpX+mpY.
Will we do any good?
It could help detect bugs. It lets code overloading a function for
integers and rationals compile. It gives an automatic way to detect which
type is "bigger".
--
Marc Glisse
More information about the gmp-discuss
mailing list