STL中的stack的pop函数为什么不返回值?
以前没有仔细想过,今天看异常安全部分,才知道了其中的缘由:
假设pop需要返回一个值,实现如下
template
<
class
T
>
T stack < T > ::pop()
{
if ( vused_ == 0 )
{
throw " pop from empty stack " ;
}
else
{
T result = v_[vused_ - 1 ];
-- vused_;
return result;
}
}
T stack < T > ::pop()
{
if ( vused_ == 0 )
{
throw " pop from empty stack " ;
}
else
{
T result = v_[vused_ - 1 ];
-- vused_;
return result;
}
}
看起来没什么问题,但是考虑这种情况:
T t = s.pop();
如果此时把函数的返回值拷贝到变量t的时候产生了异常,那么刚才的s pop出来的值就消失了。一般来说,更改函数不应当以传值的方式返回对象。
除了异常安全,还有以下原因: