Govan
Govan

Reputation: 2129

Delegating constructors in c++ () or {}

I read this link of Stroustrup with the following code:

class X {
        int a;
    public:
        X(int x) { if (0<x && x<=max) a=x; else throw bad_X(x); }
        X() :X{42} { }
        X(string s) :X{lexical_cast<int>(s)} { }
        // ...
    };

My question is about the line:

X() X{42}{}

Is there any differences between parentheses and curly brackets?
If there is no differences can I use curly brackets in other function calls as well? Or is it just in constructor delegation? And at last Why we should have both syntaxes? It is a little ambigous.

Upvotes: 27

Views: 36779

Answers (2)

Emil Laine
Emil Laine

Reputation: 42838

() uses value initialization if the parentheses are empty, or direct initialization if non-empty.

{} uses list initialization, which implies value initialization if the braces are empty, or aggregate initialization if the initialized object is an aggregate.

Since your X is a simple int, there's no difference between initializing it with () or {}.

Upvotes: 27

dspfnder
dspfnder

Reputation: 1123

Initialization values can be specified with parentheses or braces.

Braces initialization was introduced with C++11 and it is meant to be "uniform initialization" that can be used for all non-static variables.

Braces can be used in the place of parentheses or the equal sign and were introduced to increase uniformity and reduce confusion.

It is only a syntactical construct and does not result in performance benefits or penalties.

Upvotes: 6

Related Questions