$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [boost] [smart_ptr] post 1.34 regression
From: Peter Dimov (pdimov_at_[hidden])
Date: 2009-04-20 17:40:44
Gennadiy Rozental:
> Hi,
>
> Following snippet compiles fine with 1.34.1
>
> --------------------------
> #include "boost/shared_ptr.hpp"
>
> class Base {
> public:
> virtual ~Base() {}
> };
>
> class Derived;
>
> boost::shared_ptr<Base>
> foo()
> {
> return boost::shared_ptr<Derived>();
> }
>
> class Derived : public Base {};
This doesn't look legal to me. It does compile with MSVC (7.1) and g++
(3.4.6), and doesn't (as I would expect) with Como and Borland.
At the point where foo is defined, there is no conversion from Derived* to
Base*, so the instantiation of shared_ptr<Base>::shared_ptr<Base>(
shared_ptr<Derived> const& ) would fail.
I don't think that the compiler is required to postpone all template
instantiations until the end of the translation unit.