"paul moore" <paulmoore100@xxxxxxxxxxx> writes: > This code does not compile on gcc (3.2.2 on rh9 - 3.3 on suse 9) > > class test > { > public: > int x; > test(test &rhs) > { > x = rhx.x; > } > }; > > test foo(); > int main(int argc, char* argv[]) > { > test dd = foo(); C++ does not allow binding a temporary to a reference to non-const. > return 0; > } > > The test dd line gets hit saying there is no match for test::test(test), the > candidates are test::test(test&) > If I change the copy constructor to 'test(const test&)' it compiles fine. > > What am I trying to do? In real life the class contains an auto_ptr - since > the auto_ptr copy constructor updates the rhs you cannot pass it in with > const. (Note the auto_ptr copy constructor itself is declared with a non > const rhs - and code using it compiles fine - this is really > puzzling) auto_ptr uses a truly hideous trick involving a sort of proxy class called auto_ptr_ref. You are probably better off not tryiing to emulate it. If you *need* to emulate it, you'll have to look at the sources; I can't explain it. > > Also if I change foo to 'test &foo()' it compiles fine (but of course this > is totally different semantics) > Note also that MSFT vs 2003 compiles this code quite happily. M$ supports binding a temporary to a reference to non-const as an extension.