You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ full-expression组成部分定义及函数调用实参是否为操作数疑问

问题1:函数调用的实参是否算作该函数调用的操作数?

C与C的规则在此处存在差异,C体系下的相关结论不适用于C场景。根据C++标准[expr.call]章节的明确规定:函数调用表达式的操作数包含标识被调用函数的后缀表达式,以及括号内所有的实参表达式。
也就是说在你的示例中,fun(A{})作为show函数调用的第二个实参,属于show函数调用表达式的合法操作数,自然也是该表达式的子表达式。

问题2:什么是full-expression的组成部分?

C++标准[intro.execution]章节对full-expression的组成范围有补充定义,除了最基础的“不属于其他表达式子表达式、也不属于其他full-expression组成部分的表达式”之外,full-expression的组成还包含:

  • 为执行该表达式所需调用的隐式转换、构造函数、析构函数
  • 函数调用的实参初始化相关操作
  • 与该full-expression绑定的临时对象的销毁操作
  • 所有作为该表达式子表达式的其他表达式

示例场景匹配说明

你给出的代码中,show(0,fun(A{}));本身是一个独立的full-expression,而fun(A{})是它的子表达式,不属于独立的full-expression。
根据[class.temporary]的临时对象生命周期规则:绑定到函数引用形参的临时对象,生命周期会持续到包含该调用的full-expression执行完成。此处fun调用被包含在show调用对应的full-expression中,因此A{}生成的临时对象会在整个show调用执行完成后才销毁,和你观测到的运行结果完全一致。

#include <iostream>
struct A{
   A(){
       std::cout<<"A ctor\n";
   }
   ~A(){
       std::cout<<"A dtor\n";
   }
};
int fun(A const&){
    std::cout<<"abc\n";
    return 0;
}
void show(double, int){
    std::cout<<"show\n";
}
int main() {
   show(0,fun(A{}));  // #1
}

内容的提问来源于stack exchange,提问作者xmh0511

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 14:09:05