[Patch] Fix libstdc++/11378 (take2) + xsputn optmizations
Pétur Runólfsson
peturr02@ru.is
Wed Jul 9 19:21:00 GMT 2003
Nathan Myers wrote:
> We can provide overloaded operators in an ext/ header to perform
> the operations listed above. Probably we should declare but not
> define them in the regular header, to prevent them occurring via
> those implicit (and lossy) conversions.
Since streamoff has an implicit conversion to streamsize, streamsize
is a built-in integer type, and streamoff can be constructed from
streamsize,
#include <ios>
int main()
{
std::streamoff m, n;
std::streamoff o(m - n);
}
is a conforming program. I don't think it's acceptable to evaluate
m - n using 64-bit arithmetic if a particular header has been
included (possibly indirectly), otherwise 32-bit. It's hardly
acceptable either to always use 32-bit; since this program
compiles, it should work. The same applies more or less if either
of m or n is an integer type.
>> fb.pubseekoff(60 * GB, ios::beg);
>>
>> Shouldn't this work?
>
> Would you consider silently truncating the 60G value to 32 bits to be
> reasonable behavior?
No, but not surprising either (it's what happens on gcc 3.3). On a
platform that claims large file support it is hardly acceptable.
> It's what would happen on most existing
> implementations. I'd rather get an error message -- a link error, if
> necessary, ultimately directing me to a comment in the relevant header
> that explains how to evoke the non-portable behavior explicitly.
This will fail to compile if streamoff has a private, undefined
constructor for each integer type that is larger than streamsize -
and the error message will include the line in the header where the
constructor is declared.
However, this program is already non-portable - it uses the
non-standard type long long int. Is there any real value in making
it not compile?
Petur
More information about the Libstdc++
mailing list