【问题标题】:Is an init-declarator a prvalue expressioninit-declarator 是纯右值表达式吗
【发布时间】:2024-01-23 06:09:01
【问题描述】:
int c = 0;

考虑上面的代码,其中c = 0是一个init-declarator,也是一个表达式,因为这些规则:

初始化声明器:
声明初始化器(opt)

一个完整的表达式是:
[...]
init-declarator 或 mem-initializer,包括初始化器的组成表达式,

只要是一个表达式,就会有一个值类别。

纯右值是一个表达式它的求值初始化一个对象或一个位域,或者计算一个运算符的操作数的值,由它出现的上下文指定。

a = 0的求值会初始化对象a。那么,全表达式c=0是prvalue表达式吗?如果我理解有误,请指正。

【问题讨论】:

  • 成为一个完整的表达式并不意味着它是一个表达式,这很奇怪。
  • @eerorika 如果不考虑完整表达式,为什么标准中有whose full-expression is a constant expression 之类的东西?我们知道常量表达式的先验条件是必须的核心常量表达式
  • 一些完整的表达式是表达式。不是全部。
  • 如果这值得(从长远来看) - 请提出答案。对于像我这样的非理论家,跟随你的讨论让我一无所获。 :-)
  • @jackX 是的。适用于表达式的规则仅适用于表达式。如果某物不是表达式,则应用于表达式的规则不适用于它。有不是表达式的完整表达式。因此,有些规则适用于不适用于所有完整表达式的表达式。

标签: c++ c++17 language-lawyer


【解决方案1】:

考虑上面的代码,其中,c = 0 是一个init-declarator,也是一个表达式

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

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

init-declarator 的文本在某些情况下可能会被解析为表达式。但是什么东西被解析是由语法规则决定的。而simple-declaration的语法规则不允许decl-specifier-seq后跟expression。因此,它后面的内容不会被解析为 表达式,即使它可能是。

所以 init-declarator 不是 表达式,即使文本看起来可能是这样。

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

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

因此,虽然语法结构 init-declarator 是一个“完整表达式”,但 并没有使它成为一个 表达式。语法构造 expression 定义明确,int c = 0; 不符合该语法。 init-declarator 可能包含一个 表达式(或多个表达式,取决于 initializer),但它是本身不是一个表达式

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

【讨论】:

  • 我不得不说int c = 0;内的int是一个decl-specifier-seqint c = 0;内的c =0部分是一个init -声明符,因为dcl.decl#nt:init-declarator
  • 对于int c = 0;,它有三个组件,dcl.decl#2
  • @jackX:我已经修复了引用和文本,但重点仍然存在;你不会说“嘿,这个语法看起来像一个表达式,所以它是一个”。您必须遵循 C++ 的语法规则。 “它具有三个组件” 是的,这三个组件中没有一个组件本身就是一个表达式。其中一些可能包含表达式,但就 C++ 语法而言,它们不是“表达式”。
  • (杰克,在标点符号后加一个空格……现在很难阅读)
  • @jackX:您的问题是关于“完整表达式”的值类别。现在,您提出了一个不同的问题,即在某些情况下“完整表达”概念的特定用途。