$ cat t.cc class event { public: event() { /* whatever */ } // whatever }; int main() { event e = new event(); } $ CC -c t.cc $
cl 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. 1 Error(s) detected. $
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.
cl 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 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 $
Important: this fix doesn't fix the real problem.
Works better when replacing conversion operators.
explicit
keyword.
$ cat t.cc class event { public: // whatever explicit event(event *) { /* whatever */ } // whatever }; int main() { event e1 = new event(); // bad event e2 = event(new event()); // works, but bad event e3 = static_cast<event>(new event()); // works, but bad } $ CC -c t.cc "t.cc", line 24: Error: Cannot use event* to initialize event. 1 Error(s) detected. $
Important: this fix doesn't fix the real problem.
event e = new event();
is dumb code.
const
modifier on pointer and reference arguments.
*
to T is not normal.
This page last modified on 9 April 2002.