C++ init声明器的完整表达式的定义

C++ init声明器的完整表达式的定义,c++,language-lawyer,C++,Language Lawyer,在一个例子中,完整表达式的定义被称为“包括”初始值设定项的组成表达式,以及应用的任何转换/隐式调用的函数(构造函数)。这意味着完整表达式甚至不需要是表达式,这是没有意义的,因为它被称为一(init声明符不是表达式)。在标准中,完整表达式的使用就好像它是一个表达式一样,那么如果它可以包括不相交的表达式和甚至不是表达式的东西,那么这有什么意义呢 不管怎样,我的首要问题是,为什么完整的表达,并不总是表达,被视为表达?那怎么行 这意味着完整表达式甚至不必是表达式 事实上,这确实意味着。完整的表达式不一定

在一个例子中,完整表达式的定义被称为“包括”初始值设定项的组成表达式,以及应用的任何转换/隐式调用的函数(构造函数)。这意味着完整表达式甚至不需要是表达式,这是没有意义的,因为它被称为一(init声明符不是表达式)。在标准中,完整表达式的使用就好像它是一个表达式一样,那么如果它可以包括不相交的表达式和甚至不是表达式的东西,那么这有什么意义呢

不管怎样,我的首要问题是,为什么完整的表达,并不总是表达,被视为表达?那怎么行

这意味着完整表达式甚至不必是表达式

事实上,这确实意味着。完整的表达式不一定是表达式。对于init声明器,它是一个声明器

在标准的早期版本中,完整表达式被指定为特定的表达式,但“某些上下文[…]会导致对由表达式以外的句法结构产生的完整表达式进行计算”。我还没有读到建议修改措辞的提案

那么这有什么意义呢

以令人费解和困惑的方式。这并不是唯一不合适的命名法。标准中非常相似的示例:

  • 成员指针不是指针
  • 默认初始化可能会使对象未初始化
很像完全表达,这些在直觉上没有多大意义,但不管怎样,语言都是这样指定的


我已经在我的SO配置文件中列出了这些,由于这个问题,我添加了一个新的。

您能给出一些代码示例,这些代码构成了一个完整的表达式,符合这一点吗?它可以通过fiat实现这些功能。也就是说,之所以如此,是因为标准上说是这样。“充分表达”是一个具有特定定义的特定术语;正因为如此,你可能从它的组成词中得到的英语概念是不相关的。“完整表达”正是标准所说的。那么,你到底想了解什么呢?@Nicolabolas当完整表达式本身不是表达式时,它们是如何被称为具有表达式属性的。例如:[basic.start.static]/2:>变量或临时对象的常量初始值设定项o是其完整表达式为常量表达式的初始值设定项,或者是标准规定完整表达式的求值方式。如果你的问题真的是关于你刚才在评论中写的文字,那么你应该用这种方式来表达你的问题。否则,就不可能有人以一种能让你满意的方式回答你的问题you@M.M抱歉,直到现在我才知道如何表达它。那么,如果一个完整的表达式(例如)根本不是一个表达式,那么对它求值意味着什么呢?定义表达式的求值,但不定义完整表达式。@Krystian即使完整表达式可能不是表达式,也不意味着一定存在非表达式的“下一个要求值的完整表达式”。也就是说,如果在表达式后面使用init声明器声明某个内容,我非常肯定会发生这种情况。表达式列表(如果有)与任何表达式一样进行计算,并且是作为init-declarator的完整表达式的一部分。并非所有完整表达式都是表达式并不意味着不存在作为表达式的完整表达式,因此可以对其进行计算。很好,不是吗@轻快的赛车,太棒了。还有一件事,一个完整表达式“包含”另一个表达式意味着什么,它是否仅仅意味着当完整表达式也包含时,它将被计算?@eerorika您可能知道:)