探究函数调用前(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
相关产品推荐
相关产品推荐

