June 7th, 2018

What is this weird constructory syntax C::C()?

The Microsoft Visual C++ compiler supports this weird thing:

// assume a class C has been defined
C* p = (C*)malloc(sizeof(C));
p->C::C(); // huh?

This weird syntax is how people in olden times explicitly invoked a constructor on an uninitialized block of memory.

Then placement new arrived on the scene and made the above syntax obsolete.

// new hotness
C* p = (C*)malloc(sizeof(C));
new(p) C();

But the Microsoft Visual C++ compiler still supports the old syntax for backward compatibility purposes.

Note that the corresponding explicit destructor syntax

p->C::~C(); // can be shortened to p->~C() if p is of type C*

is still standard as of this writing.

Topics
Code

Author

Raymond has been involved in the evolution of Windows for more than 30 years. In 2003, he began a Web site known as The Old New Thing which has grown in popularity far beyond his wildest imagination, a development which still gives him the heebie-jeebies. The Web site spawned a book, coincidentally also titled The Old New Thing (Addison Wesley 2007). He occasionally appears on the Windows Dev Docs Twitter account to tell stories which convey no useful information.

0 comments

Discussion are closed.