关于C++中prvalue表达式的result object的技术疑问
C++ prvalue与result object相关问题解答
问题1解答
在代码struct S {}; int main(void){ S s = S(); }中,S()这个prvalue表达式的result object就是s。根据C标准[basic.lval]/5的定义,prvalue表达式的计算会初始化它的result object——这里的拷贝初始化场景下,S()的计算直接作用于s,不会生成额外的临时对象(C17及以后的“保证省略”规则),s就是被该prvalue初始化的对象,也就是它的result object。
问题2解答
在代码struct X {}; int main(void){ X(); }中,X()这个prvalue存在result object。当prvalue作为舍弃值表达式时,编译器会创建一个临时对象作为它的result object,这个临时对象会在当前完整表达式结束后被销毁。标准里并没有规定这种情况下可以省略result object,所以这个临时对象就是X()的result object。
问题3解答
对于代码struct Y {}; int main() { Y y = Y(); }:
- 从C++标准角度,
Y()这个prvalue的result object是y。根据[class.temporary]/3的规则,当prvalue用于初始化同类型对象时,不会生成临时对象,prvalue的计算直接初始化目标对象y,所以y就是该prvalue的result object。 - Clang AST中显示的“未物化临时对象”是编译器的中间表示,属于编译过程中的内部产物,并非最终运行时会存在的对象。你觉得“
y未初始化”是AST的表象,实际标准中y是被Y()直接初始化的,不存在未初始化的情况——编译器的中间步骤不影响标准层面的定义。
内容的提问来源于stack exchange,提问作者mada
相关产品推荐
相关产品推荐

