Является ли инициализатор-декларатор выражением prvalue - PullRequest
1 голос
/ 29 мая 2020
int c = 0;

Рассмотрим приведенный выше код, из него c = 0 является инициализатором-декларатором, а также выражением. На основании этих правил:

init-declarator:
инициализатор декларатора (opt)

Полное выражение:
[...]
an init-declarator или mem-инициализатор, включая составляющие выражения инициализатора,

Пока выражение, оно будет иметь категорию значений.

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

Оценка a = 0 инициализирует объект a. Итак, является ли полное выражение c=0 выражением prvalue? Если я неправильно его понял, поправьте меня.

1 Ответ

2 голосов
/ 29 мая 2020

Рассмотрим приведенный выше код, из которого c = 0 является инициализатором-декларатором, а также выражением

Это не то, как работает синтаксический анализ C ++. c = 0 сам по себе может быть выражением (если он находится в контексте, где выражения разрешены), но это не то, как int c = 0; анализируется. Вы должны следовать фактическим правилам грамматики C ++.

int c = 0; - это простое объявление , содержащее decl-спецификатор-seq и необязательный init-declarator-list . Последний представляет собой последовательность из одного или нескольких условий init-declarator . И эта грамматика состоит из двух компонентов: декларатора и необязательного инициализатора . Грамматически говоря, decl-specier-seq - это то место, где идет int, declarator - это часть c, а инициализатор - = 0 bit.

Текст init-declarator - это то, что в некоторых случаях может быть проанализировано как выражение . Но то, что что-то анализируется, определяется правилами грамматики . И правила грамматики простое объявление не допускают decl-спецификатор-seq , за которым следует выражение . Следовательно, последующее не анализируется как выражение , даже если это могло бы быть.

Итак, init-declarator не является выражением , даже если текст выглядит так, как могло бы быть.

Теперь существует концепция «полного выражения» . Одной из вещей, которые можно назвать «полными выражениями», являются init-declarator грамматика.

Часть, которая вас сбивает с толку, - это разница между «полным выражением» и выражение . Выражение - это спецификация c часть грамматики C ++ . Полное выражение не равно ; это языковая концепция, которая включает в себя несколько различных частей грамматики, но полное выражение само по себе не является грамматикой.

Следовательно, в то время как грамматическая конструкция init-declarator является «полным выражением "что не делает его выражением . Грамматическая конструкция выражение хорошо определена, а int c = 0; не соответствует этой грамматике. init-declarator может содержать выражение (или несколько выражений, в зависимости от инициализатора ), но сам он не является выражение .

И только выражение имеют категории значений. Следовательно, вопрос о ценностной категории вещи, которая не является выражением , не является правильным вопросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...