$ 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.