On Fri, Jun 3, 2011 at 5:27 PM, Darin Adler <da...@apple.com> wrote:

> From a const Node* you can get:
>
>    - a non-const pointer to a parent, sibling, or child
>    - a non-const pointer to the document
>    - a non-const pointer to the renderer
>    - a non-const pointer to the style
>    - a non-const pointer to various shadow-related ancestors and hosts
>
> That’s one problem. Extending the const-ness of the node to mean constness
> of everything you can get through all these pointers would be a big task,
> and it’s not clear it would be worthwhile.


>From the perspective of Node itself, I'm not sure why this would be a "big
task".  There shouldn't be any const accessors that return non-const
pointers.  Simply removing the "const" qualifier on all the above accessors
would make things correct, at the expense of possibly making it difficult to
use a const Node*.  Adding const versions of the accessors where necessary,
which themselves vend const pointers, is not significantly harder.

The only way this is a "big task" is if there are callers that make
significant use of const pointers to do non-const actions.  Then we need to
clean these up.  But if they're doing non-const actions, then the cleanup is
simply to make them use non-const pointers.

Further, from the document you can get to the frame and things like the
> selection controller.
>

Similarly, you shouldn't be able to get non-const pointers to the frame or
selection controller from a const document pointer.

Experience with the C++ standard library taught me that a constant pointer
> to something within a collection is a difficult concept to model with const.
> The key example here is the std::vector::erase function. It seems illogical
> that you can’t call erase on a const_iterator, because the iterator is
> identifying the location within the vector, not whether you have permission
> to modify the vector. You’re not modifying something through the iterator.


Whether or not it's reasonable to have non-const functions on containers,
which modify only the container and not the elements within it, take const
pointers to elements, seems like a separable question from the rest of the
issues with using const correctly.  I happen to find the standard library's
behavior here more reasonable than what you suggest, but regardless, all of
the other cases above could certainly be handled in a "clearly correct"
fashion.

In other words, I don't find this problem a compelling reason to discard the
entire idea of constness when it comes to objects which participate in
tree/graph relationships.

PK
_______________________________________________
webkit-dev mailing list
webkit-dev@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev

Reply via email to