Search code examples
c++syntaxconstructorinitializer-list

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?


Solution

  • 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 }
        { }