是init声明符的prvalue表达式

问题描述 投票:0回答:1
int c = 0;

考虑上面的代码,因此,c = 0是一个init声明器,它也是一个表达式,因为这些规则:

init-declarator:声明器初始值设定项(opt)

完整表达式为:[...]init-declarator或mem初始化程序,包括初始化程序的组成表达式

只要表达式,它将具有值类别。

一个prvalue是一个表达式其评估初始化一个对象或一个位字段,或计算一个运算符的操作数的值,由它出现的上下文指定。

a = 0的求值将初始化对象a。因此,完整表达式c=0是prvalue表达式吗?如果我误解了,请更正。

c++ c++17 language-lawyer
1个回答
0
投票

考虑上面的代码,因此,c = 0是一个init声明器,它也是一个表达式

这不是C ++解析的工作方式。 c = 0本身可以是一个表达式(如果在允许表达式的上下文中),但它不是“ init-declarator”。

在语句级别,文本int c = 0;init-declarator。该语法有两个组成部分:declarator和可选的initializer。在语法上,declarator是文本的int c部分; initializer= 0

现在有"full-expression"的概念。 init-declarator语法是被称为“完整表达式”的事物之一。

使您感到困惑的部分是“完整表达式”和表达式之间的区别。 expressionspecific piece of C++ grammar。完整表达不是;这是一个语言概念,其中包含许多不同的语法,但是完整表达本身并不是语法。

因此,语法结构init-declarator是一个nos使其成为expression。语法构造expression定义明确,int c = 0;不适合该语法。 init-declarator可以contain一个表达式(或多个表达式,取决于initializer),但它本身不是表达式。

而且只有表达式具有值类别。因此,询问不是表达式的事物的值类别不是一个有效的问题。

© www.soinside.com 2019 - 2024. All rights reserved.