#c
#c
Вопрос:
Это общий вопрос, который задает, как прочитать и понять стандартный документ C . То, что я хочу знать, это не синтаксис инициализатора конструктора. На самом деле я это знаю.
Я читаю N3092. В разделе 12.6.2 синтаксис инициализатора конструктора объясняется следующим образом.
ctor-инициализатор:
: mem-initializer-listmem-initializer-list:
mem-initializer … opt
mem-инициализатор, mem-инициализатор-список … optmem-инициализатор:
mem-инициализатор-идентификатор (выражение-список выбора )
mem-инициализатор-идентификатор, связанный с init-спискомmem-initializer-id:
идентификатор класса или типа decltype
Теперь, размышляя о
mem-инициализатор … opt
как вы можете узнать диапазон, в котором нижний индекс «opt» имеет эффект? Только три точки «…» или «mem-инициализатор …» в целом?
Поскольку приведенный ниже код не может быть скомпилирован, вы можете «подтвердить», что нижний индекс действует на три точки «…».
class Example {
public:
Example() : { } //=> Error: colon should be omitted.
};
Таким образом, вы можете переписать как это, где скобка () является группировкой.
mem-инициализатор ((…) opt)
Затем подумайте об альтернативном выражении.
mem-инициализатор, mem-инициализатор-список … opt
Простая проверка показывает вам, что вы должны прочитать это как это.
mem-инициализатор ((, mem-инициализатор-список … )opt)
Например, этот код не может быть скомпилирован.
class Example {
private:
int x;
public:
Example() : x(3), { } //=> Error: comma should be omitted.
};
Тогда как определяется диапазон? (НЕОБЯЗАТЕЛЬНО: Также я думаю, что значение трех точек неоднозначно. На какой странице документа определено значение с тремя точками?)
Хотя в разделе 1.6-1 говорится
Дополнительный терминальный или нетерминальный символ обозначается нижним индексом «opt«
, но я не думаю, что это решает мой вопрос (или, возможно, я не понимаю терминальный / нетерминальный символ).
Комментарии:
1.«opt» применяется только к непосредственно предшествующему символу. В «mem-initializer , mem-initializer-list … [opt]», «opt» применяется только к многоточию (в противном случае
x(3)
соответствовало бы двум правилам грамматики).2. @cpplearner Если да, то что представляет многоточие в » mem-инициализаторе , mem-initializer-list … [opt]»? Включает ли он запятую? (В противном случае я думаю,
x(3), y(3) z(3)
что это допустимо. Но это недопустимо.) Если да, то почему? Кстати, подумав дважды, теперь кажется, что первое выражение » mem-инициализатор … [opt]» сам по себе также странный, потому что в нем нет запятой.3. Многоточие представляет собой буквальное многоточие
...
. Это указывает на расширение пакета .4. @cpplearner Большое вам спасибо. Теперь я чувствую, что объяснение синтаксиса естественно.
5. Повторите «…» — если вы посмотрите очень внимательно , вы увидите, что «…» написано шрифтом code, то есть это литерал. Если это для вас не очевидно, не пинайте себя; это тонко.