Синтаксически правильно ли помещать какие-либо выражения в список инициализации c ++? - PullRequest
1 голос
/ 11 июля 2019

Я наткнулся на это определение класса из учебника:

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

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

У меня есть вопрос по поводу списка инициализации конструктора. Часть Circle{p,r} должна быть о создании базового объекта, который не похож на то, что вы положили в список инициализации. Означает ли это, что вы можете поместить любые выражения в список инициализации?

Ответы [ 2 ]

3 голосов
/ 11 июля 2019

Часть Circle {p, r} должна быть о создании базового объекта

Правильно.

, который не похож на то, что вы положили всписок инициализации

Независимо от того, на что это похоже, список инициализаторов членов - место для инициализации базового подобъекта.Несмотря на то, что член в своем названии.Технически, список инициализатора субобъекта будет более точным именем.

Означает ли это, что вы можете поместить любые выражения в список инициализации?

Нет;Неясно, как вы в конечном итоге с таким выводом.Грамматика списка инициализатора элемента следующая:

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

В случае mem-initializer-id, равного class-or-decltype, mem-initializer - для базы, а в случае identifier - для члена.

В списке выражений вы также не можете помещать произвольные выражения.Грамматика:

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 }
    { }
0 голосов
/ 11 июля 2019

Заключенное в скобки выражение не обязательно является списком инициализации. Это может быть инициализация скобки. В этом случае типы значений могут быть разными, как и старый стиль инициализации C ++ с использованием скобок. Но для initializer_list все значения должны быть преобразованы в один и тот же тип, и когда преобразование теряет точность (двойное значение для int), компилятор выдаст ошибку.

...