Hi all,

Here is code that works exactly as I think it should with g++-2.95, but not with
g++-4.0/4.1

#include <iostream>
using namespace std;

class parent
{
public:
        parent():i(0){}
        parent(int i_):i(i_){}
private:
        int i;
};

class child : public parent
{
public:
        child():parent() {}
        child(int i_):parent(i_){}
};

void trace( const parent* const& p_ptr )
{
        cout << "trace called on a reference tp pointer @"
             << (void*)&p_ptr << ": pointer = " << (void*)p_ptr << endl;
}

int main( int argc, char** argv )
{
        const child c(4);
        const child* c_ptr = &c;
        const child* const& c_ptr_r = c_ptr;
        cout << "Call trace on a reference to pointer @"
<< (void*)&c_ptr_r << ": pointer = " << (void*)c_ptr_r << endl;
        trace( c_ptr_r );
        return 0;
}


Output with g++-2.95 (which I think is right)
Call trace on a reference to pointer @0xbfb43a40: pointer = 0xbfb43a44
trace called on a reference tp pointer @0xbfb43a40: pointer = 0xbfb43a44

Output with g++-4.0 or 4.1
Call trace on a reference to pointer @0xbfac899c: pointer = 0xbfac89a0
trace called on a reference tp pointer @0xbfac89a4: pointer = 0xbfac89a0

which means that the pointer passed by reference to trace has been copied, just
as if it was passed by value.

If this is a bug, I did not find it in the bug database.
If not, can anybody tell me why ?


Thanks in advance,

Philippe


Reply via email to