[Libreoffice] OString += OString + char ... ?
Caolán McNamara
caolanm at redhat.com
Mon Feb 28 13:45:36 PST 2011
On Sun, 2011-02-27 at 04:27 -0500, Kevin Hunter wrote:
> Is that + operator expected to work with an O*String and a single character?
>
> From analysis with Sébastien Le Ray, it looks like what's happening is
> that the b OString is converted to sal_Char *, and the compiler uses
> int( '\n' ) (=10) for the + operator. So, the pointer of "Gobble
> Wobble" is moved to "ble" before the += operator takes over.
>
Yeah, looks that way.
> Changing the suspect line to
>
> a += b + "\n";
Indeed, a OString can be constructed from a "const sal_Char*", which is
just a "const char*", so OString+"\n", gets...
OString operator+(const OString &, const OString&), and the
OString(const sal_Char*) ctor is used to generate the 2nd OString from
the "\n". In the other case, the OString(sal_Char) ctor is an explicit
one (i.e. a += b + OString('\n') should do the right thing), so no
OString is generated for '\n', so the other direction is tried, and
OString has a operator const sal_Char*().
This is the kind of monstrosity that has the suggestion for "explicit"
to be allowed for conversion operators in C++0x.
Three possibilities I guess,
1) remove the "explicit", but I'm sure its there due to some other
horribly implicit conversion horror
2) add a operator+(sal_Char), either one that "just works", or one that
raises an error at compile time.
3) remove the const sal_Char* conversion operator (I'm tempted towards
this one)
C.
More information about the LibreOffice
mailing list