|
Boost : |
From: Dan W. (danw_at_[hidden])
Date: 2004-01-05 15:35:45
David B. Held wrote:
> I guess I'm still not seeing how this works. Let's look at smart_ptr
> and review what Thorsten wants. I believe he wants this:
>
> void foo(smart_ptr<T> deep_const& p)
> {
> p->nonConst(); // Boom!
> }
>
> Now, note that I've put the deep_const on the p, and not the T.
> That's because he wants the effect that declaring a pointer
> deep_const causes the pointee to be const (isn't that the point
> of deep const?). Now, obviously, I don't want to declare the
> pointee const or deep_const, like so:
No, hold on, I was the one who brought deep_const and added a truckfull
of mud to the mud-wresling arena; --don't blame him. He only used
const. So let me rephrase your question:
void foo(smart_ptr<T> const p)
{
p->nonConst(); // Boom!
}
Actually, you verbalized a question that was in my mind. I'm not
exactly sure whether he meant that he wanted that in general, or only in
the context of p being a member of a class and receiving
address-constness indirectly, by virtue of a const function of the class
of which it is a member, being called. I also think that he wants the
compiler to forbid,
int foo(smart_ptr<T> p) const;
and mandate
int foo(smart_ptr<T const> p) const;
or else make the former mean the latter implicitly.
Both above rules I apply in my coding, by discipline, by the way; so,
it's not that I disagree with him on aesthetical grounds... Just that I
would rather not have the language mandate it.
Now, if you're asking me whether I'd have that be the meaning of
deep_const, at first look I'd say I'd rather see T deepconst * as the
correct syntax, even though technically T * deepconst "should" mean the
same, strictly speaking; I'd rather keep the ability to specify whether
I can re-point my deepconstness in some other direction or not by writing,
T deepconst * p;
T deepconst * const cp;
which ability does not propagate, I realize... (I smell a rat)
> smart_ptr
> {
> T deep_const* p_;
> };
>
> Because how do you return a non-const pointer without a cast?
Just use deep_ptr<> :)
Sorry, where do we have to return a non-const pointer?
Or, are you talking about the address-constness of the pointer?
Oh!, I get it! If the pointer, the address, is const, it cannot be
assigned! And if I make the root-pointer's address non-const, then my
definition of deep-constness is not recursively defined!
A rat indeed it was. Thank you!
( God there's smart people in this place! ;-) )
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk