Рассмотрим приведенный выше код, из которого 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 может содержать выражение (или несколько выражений, в зависимости от инициализатора ), но сам он не является выражение .
И только выражение имеют категории значений. Следовательно, вопрос о ценностной категории вещи, которая не является выражением , не является правильным вопросом.