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

探究函数调用前(void)的作用:为何逗号表达式返回值不同?

为什么逗号表达式中加入(void)会改变返回值?

先看你给出的代码:

struct S {
  int operator,(int) { return 0; }
};
std::cout << (S(), 42) << '\n';           // prints '0'
std::cout << ((void) S(), 42) << '\n';    // prints '42'

第一种情况:(S(), 42)

这里的逗号并不是C++的内置逗号运算符,而是调用了S类重载的operator,成员函数:

  • 首先执行S(),创建一个S类型的临时对象;
  • 这个临时对象会和后面的42一起触发重载的operator,(int),该函数返回0,所以最终输出0。

第二种情况:((void) S(), 42)

这里的(void)强制把S()创建的临时对象转换成void类型,直接改变了逗号的语义:

  • void类型无法参与重载运算符的调用,因此这里的逗号是内置逗号运算符;
  • 内置逗号运算符的规则是:先计算左边表达式(执行(void)S()后丢弃结果),然后返回右边表达式的值(也就是42),所以最终输出42。

总结:加(void)的核心作用是绕过用户重载的逗号运算符,强制使用C++原生的内置逗号运算符,两者行为规则完全不同,因此返回值出现差异。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:10:41