zell
zell

Reputation: 10204

Is it syntactically correct to put any kind of expressions in c++'s initialization list?

I came across this class definition from a textbook:

class Smiley : public Circle { // use the circle as the base for a face public:

Smiley(Point p, int r) : Circle{p,r}, mouth{nullptr} { }

I have a question about the constructor's initialization list. The Circle{p,r} part should be about constructing a base object, which does not look like something you put in an initialization list. Does it mean that you can put any kind of expressions in the initialization list?

Upvotes: 1

Views: 80

Answers (1)

eerorika
eerorika

Reputation: 238341

The Circle{p,r} part should be about constructing a base object

Correct.

which does not look like something you put in an initialization list

Regardless of what it looks like to you, the member initialiser list is the place to initialise the base sub object. Despite having member in its name. Technically, sub object initaliser list would be more accurate name.

Does it mean that you can put any kind of expressions in the initialization list?

No; It's unclear how you would end up with such conclusion. The grammar of member initialiser list is following:

ctor-initializer:
    : mem-initializer-list

mem-initializer-list:
    mem-initializer ... opt
    mem-initializer-list , mem-initializer ... opt

mem-initializer:
    mem-initializer-id ( expression-list opt )
    mem-initializer-id braced-init-list

mem-initializer-id:
    class-or-decltype
    identifier

In case of mem-initializer-id being class-or-decltype, the mem-initializer is for a base and in case of identifier it is for a member.

Within the expression-list, you cannot put any arbitrary kinds of expressions either. The grammar is:

expression-list:
    initializer-list

initializer-list:
    initializer-clause ... opt
    initializer-list , initializer-clause ... opt

initializer-clause:
    assignment-expression
    braced-init-list

braced-init-list:
    { initializer-list , opt }
    { designated-initializer-list , opt }
    { }

Upvotes: 3

Related Questions