* Alf P. Steinbach:
* goodbyeera@gmail.com:
class A {
void f() { this->A::A(); }
};
Let's just put away the logic of the program for a moment. I'm just
wondering whether this syntax is legal in standard C++ or not.
The above is not valid syntax in standard C++.
But regarding your question which you inconveniently put only in the
subject line, "Is it legal to directly call a constructor", yes of
course it is (regarding a constructor of a most derived class the only
indirect way is via the 'new' operator
Or by having an instance of that class as a default-constructed member.
Sorry.
Didn't think of that when just typing away...
time you call a constructor.
Given your example, what you probably meant was to ask, "Does C++
support calling a constructor on existing storage?", and the answer to
that is also yes.
This
compiles OK in VC and GCC, but fails in Comeau.
It shouldn't compile with any compiler.
For g++, have you remembered to specify -pedantic and -std=c++98?
For VC, which version?
I'm not able to find
a direct answer to this in the standard. Can anyone help to explain
whether it is syntactically legal? Thank you very much.
The C++ syntax for calling a constructor on existing storage is the
basic placement new, like, for emulating what you're trying to do above,
#include <new>
...
this->A::~A(); // Must first be destroyed.
::new( this ) A(); // Resurrect.
This is extremely dangerous when you don't know what you're doing, which
you don't when you're enquiring about the syntax. It's even extremely
dangerous when you do think you know what you're doing, or perhaps
especially then! There's very seldom any reason to do it; if or when you
feel that that the above could be a solution to something, ask about
solutions to the something (they will exist, and they will not include
the above).
Cheers & hth.,
- Alf
Due to hosting requirements I need visits to <url: http://alfps.izfree.com/>.
No ads, and there is some C++ stuff! :-) Just going there is good. Linking