From: Sebastian Theophil (stheophil_at_[hidden])
Date: 2007-11-21 09:05:07
Yesterday I had run into issues compiling boost::counting_iterator under
Visual Studio. The reason is integer_traits<Integer>::difference_type
which is used as a default difference_type for the counting_iterator.
This has already been discussed here:
But I don't think the discussion went far enough:
- First of all, this is not just an issue concerning compiler warnings
about 64 bit conversion issues (/Wp64) as Orhun suggested in the above
- Trying to convert __int64 to int is a level 1 compiler warning
(http://msdn2.microsoft.com/en-us/library/aa984663(VS.71).aspx) and in
my opinion, the compiler should warn about implicit down-casts.
- David suggested in the thread, that (quote) "These 'integer size
warnings' are nothing more than a nuisance in most generic code. IMO
they should be turned off on the command line."
To this, I strongly object. The integer size warning is correct and may
be a simple programming error that a developer should at least look at.
It is the supposed greater generality of defining integer_traits<int> to
be __int64 that causes a problem here.
- Defining integer_traits<int>::difference_type as __int64 is first of
all pretty inconsistent
- integer_traits<__int64>::difference_type of course also is __int64 for
lack of a larger type
- *Most importantly, no one defines std::ptrdiff_t as __int64 although
the same reasoning would apply*
Integer values may overflow. Even __int64 values may overflow.
There may be cases where you need (int - int) to be a __int64 just like
(int * int) should be __int64. In general however, I would like int +
(int - int) to be an int again. As a developer I know this can overflow
but int = int + __int64(int - int) will overflow too and if I do __int64
+ (__int64 - __int64) then this may overflow too!
(Besides, in the context of iterators it is extremely weird for an
iterator on ints to have an operation advance(__int64).)
There's no general solution preventing ints from overflowing. The
numeric_traits implementation forces me to disable perfectly valid
static type checks for no apparent value at all. Let me take care of
overflowing problems where *I* think they may occur. Let the compiler do
proper type checks.
Regards and I'm looking forward to comments on this,
-- Sebastian Theophil . stheophil_at_[hidden] Software Engineer think-cell Software GmbH . Invalidenstr. 34 . 10115 Berlin, Germany http://www.think-cell.com . phone +49-30-666473-10 . fax +49-30-666473-19 Geschaftsfuhrer: Dr. Markus Hannebauer, Arno Schoedl . Amtsgericht Charlottenburg, HRB 85229
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk