$ 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 10 April 2003.