------- Comment #3 from jeidsath at gmail dot com  2007-11-21 23:52 -------
(In reply to comment #2)
> I think this is the issue, nothing specific to std::auto_ptr:
> 
> struct G { G() { } G(G&) { } };
> 
> int main()
> {
>   class A
>   {
>     const G g;
>   };
>   A a;
>   A b = a;
> }
> 

No, copying of const values is certainly allowed:

const int i = 5;
const int i2 = i; //SHOULD compile

Your struct G can also be created and copied:

G g;
G g2 = g;

However, the same does not work with const auto_ptr, because copying
is a non-const operation for auto_ptrs:

const auto_ptr<int> i;
const auto_ptr<int> i2 = i; //ERROR

Did you mean to make the copy constructor private? In that case, G
certainly won't work in my example, const or not, and g++ catches
this.

Now, if you're trying to make a more general example, try this:

#include <iostream>
struct H
{
       H()
       { a=5; } ;
       H(H& rhs)
       { rhs.a=10; };
       int a;
};

int main()
{
       struct B
       {
               const H h;
       };
       B b;
       B b2 = b;
       std::cout << b.h.a << "\n";//ERROR prints out "10",
       //b.h has been changed despite constness
}


The copy constructor for H does not take a const reference because I
am modelling auto_ptr -- compare gcc's definition of the auto_ptr copy
constructor in "memory":
     auto_ptr(auto_ptr& __a) throw() : _M_ptr(__a.release()) { }

Joel Eidsath


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34180

Reply via email to