函数调用实参表达式概念解析及相关标准参考咨询
C++实参表达式相关问题解答
1. 语境中的实参表达式概念
在这段Stack<T>::pop()代码里,return v[top--];这句实际会触发T的拷贝构造函数(因为要返回T类型对象,需生成临时对象)。这里说的实参表达式,就是传递给拷贝构造函数的那个表达式——也就是v[top--]。
简单来说:当调用一个函数(这里是T的拷贝构造函数)时,用来初始化函数形参的所有表达式都叫实参表达式。C++的规则要求,函数调用的函数体执行前,所有实参表达式必须被完全求值,包括表达式里的副作用(比如这里的top--后置递减操作)。所以在拷贝构造函数开始复制v[top]的值之前,top已经先减了1。这就会导致一个问题:如果拷贝构造函数抛出异常,top已经被修改,但栈里对应的元素其实还没被正确弹出,栈的状态就不一致了。
2. 相关标准与参考说明
- C++标准:标准明确规定,函数调用时,实参表达式的求值(包括所有副作用)必须在函数执行开始前完成。也就是说,进入函数体之前,所有实参的计算和副作用都已经结束。
- cppreference内容:关于函数调用的求值顺序,cppreference提到,函数的实参表达式会在函数调用前被求值;单个实参的所有子表达式都会被完全求值,包括副作用(比如自增、自减操作)。对于返回语句中的对象拷贝,在C++17之前,返回自动对象会触发拷贝构造,此时返回的表达式就是拷贝构造函数的实参,其副作用会在拷贝操作前全部完成。
内容的提问来源于stack exchange,提问作者Vinod
相关产品推荐
相关产品推荐

