Is there any difference between `List x;` and `List x()`

c++, most-vexing-parse, variable-declaration

Solution

And if it really is a declaration wouldn't the compiler complain that you cannot declare a function within a function.

Of course not. Because you can declare a function withing a function.

This is called most vexing parse and it's well documented. In fact, it would be an error on behalf of the compiler to treat

List x();

as a variable declaration.

But is it really wrong to use the second variant?

If you want a variable, then yes. If you want to declare a function... kinda yes. You can, but usually you'd do it outside of a function scope.

Problem

The title comes from the famous site C++ FAQ by Marshall Cline. The author claims that there is a difference between the following two code examples. Suppose that List is the name of some class. Then function f() declares a local List object called x: ``` void f() { List x; // Local object named x (of class List) ... } ``` But function g() declares a function called x() that returns a List: ``` void g() { List x(); // Function named x (that returns a List) ... } ``` But is it really wrong to use the second variant? And if it really is a declaration wouldn't the compiler complain that you cannot declare a function within a function?

Original source