Re: do not allow implicit conversion in constructor
On 7/22/2014 6:04 PM, Christopher Pisz wrote:
I am working on some code where yet another developer in the past
decided to roll their own reference counting pointer. Like every time
I've run across this in the past, it is broken, sure enough.
In the interest of a quick fix, I want to first try the direct route,
rather than replacing it with boost::shared_ptr everywhere it is used. I
can't use std::shared_ptr, because they want to support XP and are thus
limited to the msvc 2010 runtime.
The problem arises when a comparison statement like
if (theDevilsRefCountedHandle != 0)
is made.
In debugging, I find that rather than do the intended comparison of
underlying raw pointers, the compiler wants to create another object by
calling
TheDevilsRefCountedHandle(RefCountedObjectBody * pBody)
:
mRefCountedObjectBodyPointer(pBody)
Is there a handy dandy way, pre C++'11 to say, don't do that conversion
from integral value to pointer and call a copy instructor, look for
another operator instead?
The simplest way I know is to declare the constructor from a raw pointer
explicit. You can't avoid standard conversion from integral 0 to a null
pointer, but after that a constructor needs to fire, and if you declare
it 'explicit', the compiler will disregard that conversion sequence (and
complain, probably).
and what operator can I implement to handle the intended comparison?
You can implement your own
bool operator !=(int)
and
bool operator == (int)
of course, since '0' is a literal of type 'int'.
operator bool maybe to convert the lhs to a boolean before the compare
is done?
Not a good idea, I think.
V
--
I do not respond to top-posted replies, please don't ask