我正在讨论如何正确处理容器作为参数。
我们有一个接受容器参数的函数,并希望返回仅填充了函数放入其中的容器:
class bar;
void foo(std::vector<bar> &bars)
{
//do stuff that fills bars.
//exceptions may be thrown.
//we may also legally return early
return;
}
在讨论的一方面,有人说我们应该bars.clear()
先运行该函数。
例如:
void foo(std::vector<bar> &bars)
{
bars.clear();
//do stuff that fills bars.
//exceptions may be thrown.
//we may also legally return early
return;
}
我自己的偏好是尽可能接近强异常保证,这意味着制作一个本地容器,填充它并在返回之前进行交换,否则保持bars
不变。
例如:
void foo(std::vector<bar> &bars)
{
std::vector<bar> localBars;
//do stuff that fills localBars.
//exceptions may be thrown.
//we may also legally return early
if (returnEarly)
{
bars.swap(localBars);
return;
}
//do more stuff that may change localBars
bars.swap(localBars);
return;
}
第一个例子是“经典”方法;在做任何事情之前清除你的参数并从那里开始。
对我来说,第二种方法设置了强大的异常保证(假设函数所做的任何事情都不能改变内部状态),并且避免了 clear() 调用。
选择一种方法而不是另一种方法有什么优点或缺点吗?
请注意,对于此功能,不需要强大的异常保证;如果函数在参数中没有失败,或者在它到达异常处理程序时,它所做的任何事情都会很重要。