Search code examples
c++c++11constructormost-vexing-parse

C++11 Difference in Constructors (Braces)


I am quite new to C++ and have observed, that the following lines of code act differently

MyClass c1;
c1.do_work() //works
MyClass c2();
c2.do_work() //compiler error c2228: left side is not a class, structure, or union.
MyClass c3{};
c3.do_work() //works

with a header file as

class MyClass {
public:
    MyClass();
    void do_work();
};

Can you explain me, what the difference between the three ways of creating the object is? And why does the second way produce a compiler error?


Solution

  • Ways one and three call the default constructor.

    MyClass c3{};
    

    Is a new initialization syntax called uniform initialization. This is called default brace initialization. However:

    MyClass c2();
    

    Declares a function c2 which takes no parameters with the return type of MyClass.