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)也是如此。这
项目符号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声明程序的完整表达式就是这样的完整表达式,它(动态地)包含其他表达式。