Re: Incomplete class with auto_ptr
On 2012-02-29 12:58, Kris Prad wrote:
This code snippet results in compiler warning:
----
#include<memory>
class A; // fwd class decl.
void test()
{
A* a;
std::auto_ptr<A> ap(a); // A is not defined here
}
This code is non-conforming. std::auto_ptr requires (implied by the
general library requirements) that the template argument must be a
complete type.
On Comeau online compiler:
"memory", line 76: warning: delete of pointer to incomplete class
~auto_ptr() { delete _M_ptr; }
My question:
Eventually ~auto_ptr() must see the underlying class definition for
the code to work correctly. So, why is this only a warning, and not a
full fledged error?
Note that there is no fundamental need for a constructor to see the
complete type. The language explicitly describes when this is
well-defined (The short version is: If the type has a non-trivial
destructor or a class-specific deallocation function).
If you can, use std::unique_ptr (from C++1): It is specified to make the
code ill-formed (including diagnostic), if the template parameter is
incomplete, when std::unique_ptr's destructor is instantiated.
HTH & Greetings from Bremen,
Daniel Kr?gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]