init-declarator 是一个 prvalue 表达式吗?

3
int c = 0;

考虑上面的代码,其中 c = 0 是一个初始声明符,也是一个表达式,因为这些规则:
init-declarator:     declarator 初始化程序(可选)
完整表达式是:     [...]     一个 init-declarator 或 mem-initializer,包括初始化程序的组成表达式
只要是表达式,它就会有一个值类别。 prvalue 是一个表达式,其评估初始化对象或位域,或计算操作数的值,如其出现的上下文所指定。 a = 0 的评估将初始化对象 a。那么,全表达式 c=0 是 prvalue 表达式吗?如果我误解了,请纠正我。

4
成为一个完整表达并不意味着它本身就是一个表达式,奇怪的是。 - eerorika
@eerorika 如果一个完整表达式不被考虑,那么为什么标准中会出现“其完整表达式是常量表达式”的说法呢?我们知道常量表达式的先决条件是它必须是核心常量表达式。 - xmh0511
1
有些完整表达式是表达式,但并非全部。 - eerorika
2
如果这将来有任何价值,请提供一个答案。对于像我这样的非理论家,跟随你们的讨论毫无意义。 :-) - Ted Lyngmo
4
是的,适用于表达式的规则只适用于表达式。如果某个东西不是表达式,则适用于表达式的规则不适用于它。有一些完整表达式并非表达式。因此,适用于表达式的规则不适用于所有完整表达式。 - eerorika
显示剩余14条评论
1个回答

3
考虑上述代码,其中的c = 0是一个init-declarator,也是一个表达式。
这不是C++解析工作的方式。 c = 0本身可能是一个表达式(如果它在允许表达式的上下文中),但这不是int c = 0;的解析方式。您必须遵循实际的C++语法规则。

int c = 0; 是一个简单声明,包含一个decl-specifier-seq和一个可选的init-declarator-list。后者是一个或多个init-declarator术语的序列。这个语法有两个组成部分:一个declarator和一个可选的initializer。从语法上讲,decl-specifier-seqint所在的位置,declaratorc部分,initializer= 0部分。

init-declarator中的文本在某些情况下可能被解析为expression。但是,解析成什么取决于语法规则。而simple-declaration的语法规则不允许在decl-specifier-seq之后紧跟expression。因此,即使可以解析为expression,其后面的内容也不会被解析为expression

因此,即使文本看起来像是expressioninit-declarator也不是expression

现在,有一个"full-expression"的概念。其中一个被称为"full-expressions"的东西就是init-declarator语法。

你所困惑的部分在于“完整表达式”和“表达式”的区别。一个“表达式”是C ++语法的特定部分。完整表达式则不是;它是一种语言概念,包括许多不同的语法结构,但完整表达式本身并不是语法。
因此,虽然语法结构“init-declarator”是一个“完整表达式”,但这并不意味着它是一个“表达式”。语法结构“表达式”是被明确定义的,而“int c = 0;”并不符合这个语法。 “init-declarator”可以包含一个或多个表达式(取决于初始化程序),但它本身不是一个表达式。
只有“表达式”才有值类别。因此,询问一个不是“表达式”的东西的值类别是无效的问题。

我必须说,int c = 0; 中的 int 是一个 decl-specifier-seq,而 int c = 0; 中的 c = 0 则是一个 init-declarator,因为dcl.decl#nt:init-declarator - xmh0511
感谢您的回答。简而言之,您的意思是标准中适用于表达式的这些规则不能随意应用于完整表达式。然而,我对句子“初始化的完整表达式应为常量表达式”有些困惑,我们知道[expr.const]中的这些规则适用于表达式,那么如何解释这个问题呢?一个init-declarator不是一个表达式,如何使用[expr.const]中的这些规则来确定它是否为常量表达式? - xmh0511
1
(Jack,请在标点符号后加上一个空格...现在很难阅读) - Ted Lyngmo
1
@jackX:你的问题涉及“完整表达式”的值类别。现在你正在问一个关于“完整表达式”概念在某些情况下特定用法的不同问题。 - Nicol Bolas
@NicolBolas您好,Nicol。请回答这个问题 - xmh0511
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接