В стандартном документе C , как узнать диапазон, в котором подстрочный индекс «opt» имеет эффект?

#c

#c

Вопрос:

Это общий вопрос, который задает, как прочитать и понять стандартный документ C . То, что я хочу знать, это не синтаксис инициализатора конструктора. На самом деле я это знаю.


Я читаю N3092. В разделе 12.6.2 синтаксис инициализатора конструктора объясняется следующим образом.

ctor-инициализатор:
: mem-initializer-list

mem-initializer-list:
mem-initializer … opt
mem-инициализатор, mem-инициализатор-список … opt

mem-инициализатор:
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, то есть это литерал. Если это для вас не очевидно, не пинайте себя; это тонко.