int c = 0;
考虑上面的代码,因此,c = 0
是一个init声明器,它也是一个表达式,因为这些规则:
init-declarator:声明器初始值设定项(opt)
完整表达式为:[...]init-declarator或mem初始化程序,包括初始化程序的组成表达式
只要表达式,它将具有值类别。
一个prvalue是一个表达式其评估初始化一个对象或一个位字段,或计算一个运算符的操作数的值,由它出现的上下文指定。
a = 0
的求值将初始化对象a
。因此,完整表达式c=0
是prvalue表达式吗?如果我误解了,请更正。
考虑上面的代码,因此,c = 0是一个init声明器,它也是一个表达式
这不是C ++解析的工作方式。 c = 0
本身可以是一个表达式(如果在允许表达式的上下文中),但它不是“ init-declarator”。
在语句级别,文本int c = 0;
是init-declarator。该语法有两个组成部分:declarator和可选的initializer。在语法上,declarator是文本的int c
部分; initializer是= 0
。
现在有"full-expression"的概念。 init-declarator语法是被称为“完整表达式”的事物之一。
使您感到困惑的部分是“完整表达式”和表达式之间的区别。 expression是specific piece of C++ grammar。完整表达不是;这是一个语言概念,其中包含许多不同的语法,但是完整表达本身并不是语法。
因此,语法结构init-declarator是一个int c = 0;
不适合该语法。 init-declarator可以contain一个表达式(或多个表达式,取决于initializer),但它本身不是表达式。
而且只有表达式具有值类别。因此,询问不是表达式的事物的值类别不是一个有效的问题。