问题
Possible Duplicate:
Why is it an error to use an empty set of brackets to call a constructor with no arguments?
Lets have this code
class Foo {
Foo(int) { }
};
Then we have there results:
int main() {
Foo f1 = Foo(5); // 1: OK, explicit call
Foo f2(5); // 2: OK, implicit call
Foo f3(); // 3: no error, "f3 is a non-class type Foo()", how so?
Foo f4(f1); // 4: OK, implicit call to default copy constructor
Foo f5; // 5: expected error: empty constructor missing
}
Can you explain what's happening in case 3?
回答1:
Foo f3();
declares a function called f3
, with a return type of Foo
.
回答2:
The third line is parsed as declaring a function that takes no argument and returns a Foo
.
回答3:
C++ has a rule that if a statement can be interpreted as a function declaration, it is interpreted in this way.
Hence the syntax Foo f3();
actually declares a function which takes no arguments and returns Foo
. Work this around by writing Foo f3;
, it will call the default constructor too (if there is one, of course).
回答4:
f1
invokes the copy constructor after an explicit call, you were wrong on this onef2
is an explicit constructor call // you were wrong here toof3
declares a functionf4
is again the copy constructor, likef1
// you're right heref5
would calls the default constructor // you're right here again
回答5:
This isn't what you think it is:
Foo f3();
You may think this is an explicit call of the default constructor, but it's not. It's actually a declaration of a function named f3
which takes no parameters and returns a Foo
by value.
That this is parsed as a function declaration rather than a constructor call is known as the Most Vexing Parse.
回答6:
You've defined a function called f3 that returns a foo in case 3. In case 5, you have no default constructor defined, so you get an error.
来源:https://stackoverflow.com/questions/8475851/c-spooky-constructor