c++constructordefault-constructorc++-faqmost-vexing-parse

Why can't the default constructor be called with empty brackets?


Is there any good reason that an empty set of round brackets (parentheses) isn't valid for calling the default constructor in C++?

MyObject  object;  // ok - default ctor
MyObject  object(blah); // ok

MyObject  object();  // error

I seem to type "()" automatically everytime. Is there a good reason this isn't allowed?


Solution

  • Most vexing parse

    This is related to what is known as "C++'s most vexing parse". Basically, anything that can be interpreted by the compiler as a function declaration will be interpreted as a function declaration.

    Another instance of the same problem:

    std::ifstream ifs("file.txt");
    std::vector<T> v(std::istream_iterator<T>(ifs), std::istream_iterator<T>());
    

    v is interpreted as a declaration of function with 2 parameters.

    The workaround is to add another pair of parentheses:

    std::vector<T> v((std::istream_iterator<T>(ifs)), std::istream_iterator<T>());
    

    Or, if you have C++11 and list-initialization (also known as uniform initialization) available:

    std::vector<T> v{std::istream_iterator<T>{ifs}, std::istream_iterator<T>{}};
    

    With this, there is no way it could be interpreted as a function declaration.