$ cat t.cc class event { public: event() { /* whatever */ } }; int main() { event e = new event(); } $ CC -c t.cc $
$ cat bad.cc int main() { double d = new double(3.1415); } $ CC -c bad.cc "bad.cc", line 2: Error: Cannot use double* to initialize double. $
int
, or there's a conversion.
int
, so there must be a conversion. But where?
Sure enough:
event::event(event * ep) { /* whatever */ }
new event()
calls the default constructor,event *
to an event
and do the initialization.
$ cat t.cc class event { public: event() { cerr << "default\n"; } event(event *) { cerr << "conversion\n"; } event(const event &) { cerr << "copy\n"; } }; int main() { event e = new event(); } $ CC -o t t.cc $ ./t default conversion $
int main() { event e; }
or, more generally,
event * ep = new event(); event e1 = *ep; // copy e = *ep; // assignment
$ cat t.cc class event { public: event from_pointer(void) { return *this; } string to_string(void) { // whatever } }; int main() { event e = (new event())->from_pointer(); cout << e.to_string() << "\n"; } $ CC -c t.cc $
explicit
Fixexplicit
keyword.
$ cat t.cc class event { public: explicit event(event *) { ... } }; int main() {event e1 = new event();// bad // explicit conversion, but still bad. event e2 = event(new event()); // static cast, but still bad. event e3 = static_cast<event>(new event()); } $ CC -c t.cc "t.cc", line 24: Error: Cannot use event* to initialize event. $
event e = new event(); event e = (new event())->from_pointer(); event e = event(new event());
Where does the pointer go after conversion?
event e = new event()
is dumb code.
*
to T is not normal.
This page last modified on 25 March 2004.