std::auto_ptr and const correctness
Hi,
in the project I am working on, std::auto_ptr is used to implement
move semantics and sometimes to store pointers in classes which cannot
be copied. When I analyzed some old code, I found a flaw in the
definition of std:.auto_ptr which breaks const-correctness of the
code:
#include <memory>
class X
{
public:
void f() {i=42;}
int i;
};
template<typename T>
class AutoPtr
{
public:
explicit AutoPtr(T* ptr) : t(ptr) {}
T* operator->() {return t;}
T const* operator->() const {return t;}
T* get() {return t;}
T const* get() const {return t;}
private:
T* t;
};
class Test
{
public:
void f() const
{
autoPtr->f();
X* x = autoPtr.get();
x->f();
}
void g() const
{
customAutoPtr->f();
X* x = customAutoPtr.get();
x->f();
}
std::auto_ptr<X> autoPtr;
AutoPtr<X> customAutoPtr;
};
When this is compiled, the compiler only reports an error for method
Test::g(), not for Test::f(), e.g. the Comeau compiler:
Thank you for testing your code with Comeau C/C++!
Tell others about http://www.comeaucomputing.com/tryitout !
Your Comeau C/C++ test results are as follows:
Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for
ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing. All rights reserved.
MODE:strict errors C++ noC++0x_extensions
"ComeauTest.c", line 39: error: the object has cv-qualifiers that are
not compatible
with the member function
object type is: const X
customAutoPtr->f();
^
"ComeauTest.c", line 40: error: a value of type "const X *" cannot be
used to
initialize an entity of type "X *"
X* x = customAutoPtr.get();
^
2 errors detected in the compilation of "ComeauTest.c".
Additionally, the standards specifies std::auto_ptr to have the
following members:
// 20.4.5.2 members:
X& operator*() const throw();
X* operator>()
const throw();
X* get() const throw();
X* release() throw();
void reset(X* p =0) throw();
Is there any reason why the methods are specified const but return a
non-const pointer? I know that std::auto_ptr is deprecated, but this
looks as a serious flaw.
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]