C++ 当规则显示初始化的完整表达式时,哪个是完整表达式 结构{ constexpr S(inti):i(i),D(i){}//完整表达式是i的初始化和D的初始化 私人: int I; int D; }; int main(){ constexpr S s1=1;//完整表达式包含对S的调用​::​S(国际) }

C++ 当规则显示初始化的完整表达式时,哪个是完整表达式 结构{ constexpr S(inti):i(i),D(i){}//完整表达式是i的初始化和D的初始化 私人: int I; int D; }; int main(){ constexpr S s1=1;//完整表达式包含对S的调用​::​S(国际) },c++,c++17,language-lawyer,C++,C++17,Language Lawyer,根据充分表达的定义: 一个完整的表达是 未赋值的操作数 一个不变的表达 init声明符或mem初始值设定项,包括初始值设定项的组成表达式 在对象(临时对象除外)的生命周期结束时生成的析构函数调用,或 不是另一个表达式的子表达式且不是完整表达式的一部分的表达式 对于初始值设定项,执行实体初始化(包括计算聚合的默认成员初始值设定项)也被视为完整表达式的一部分 项目符号3表示s1=1是一个完整表达式,因为它是init声明符,I(I)是一个完整表达式,因为它是mem初始值设定项,对于D(I)也是如此。这

根据充分表达的定义:

一个完整的表达是

  • 未赋值的操作数
  • 一个不变的表达
  • init声明符或mem初始值设定项,包括初始值设定项的组成表达式
  • 在对象(临时对象除外)的生命周期结束时生成的析构函数调用,或
  • 不是另一个表达式的子表达式且不是完整表达式的一部分的表达式
  • 对于初始值设定项,执行实体初始化(包括计算聚合的默认成员初始值设定项)也被视为完整表达式的一部分


    项目符号3表示
    s1=1
    是一个完整表达式,因为它是init声明符,
    I(I)
    是一个完整表达式,因为它是
    mem初始值设定项
    ,对于
    D(I)
    也是如此。这意味着初始化实体
    s1
    可以包含多个完整表达式?在这种情况下,这组完整表达式中初始化的完整表达式是哪个?

    当然完整表达式可以动态嵌套:考虑

    void f(int i) {
      ++i;   // (useless) full-expression
    }
    void g() {
      f(1);  // full-expression
    }
    

    因此,初始化
    s1
    是init声明程序完整表达式的一部分,同时也包含其mem初始值设定项的完整表达式之间没有冲突。

    为什么您认为
    1
    是一个常量表达式?为什么构造函数调用不是init声明器的一部分?@DavisHerring是的,你是对的
    1
    不是一个常量表达式,而是一个常量表达式。那么,这里初始化的完整表达式是什么?那么,在我的问题中,初始化的完整表达式是什么?或者它意味着所有的完整表达式?@jackX:为什么它不是相关init声明程序的完整表达式?这就是初始化。你是说除了init声明程序的完整表达式之外的任何完整表达式?@jackX:这不是我说的吗?噢,init声明程序的完整表达式就是这样的完整表达式,它(动态地)包含其他表达式。