Boost logo

Boost :

From: Kevlin Henney (kevlin_at_[hidden])
Date: 2004-03-01 07:26:17

In message <c1umak$2ou$1_at_[hidden]>, Vladimir Prus <ghost_at_[hidden]>
>Something is still unclear. If the number of individual values a type can
>hold is the only criteria for "widening", then is T* -> shared_ptr<T*>
>conversion widening? After all, shared_ptr<T*> can hold all pointer values
>out there, plus it holds reference count, so the total number of values is

The number of legal values is, in principle and in practice, smaller:

        T o;
        boost::shared_ptr<T> p(&o);
        boost::shared_ptr<T> q(new T); // OK

However, there is more to conversions than just narrower vs wider (see

>If that's widening conversion, then constructor of shared_ptr<T*> need not
>be explicit, but that would be really unsafe. You say windening conversion
>often loose information, and in this fact you can easily loose information
>that pointer is allocated on stack, or that it's "this" pointer.

Information loss is not the deciding criterion for whether a conversion
is narrowing or widening :-)

Another distinction that needs to be made is that not all conversions
fit into the widening/narrowing model. Some conversions are better
considered as reinterpreting or translating conversions (eg lexical_cast
and reinterpret_cast). These are useful where some notion of subtyping
is not applicable, eg between int and string, as opposed to where one
is, eg between numeric types.


  Kevlin Henney                   phone:  +44 117 942 2990
  mailto:kevlin_at_[hidden]     mobile: +44 7801 073 508        fax:    +44 870 052 2289
  Curbralan: Consultancy + Training + Development + Review

Boost list run by bdawes at, gregod at, cpdaniel at, john at