我对C++标准中“无副作用”保证的理解正确吗?
对某些库函数,C++标准在(有条件地)以 强异常保证 的形式规定了“没有副作用”。这在例如 std::vector::reserve [vector.capacity/4/4] 的情境中成立:
如果抛出的异常不是由一个非 Cpp17CopyInsertable 类型的移动构造函数引起的,没有副作用。
然而,很容易举出一个违反此规则的例子:
#include <vector>
int state = 1; // part of program state
struct X
{
X() = default;
X(const X&)
{
state = -1;
throw 1;
}
};
int main()
{
std::vector<X> vx;
vx.emplace_back();
// `state` equals 1 here
try {
vx.reserve(2 * vx.capacity());
}
catch(...)
{
// `state` equals -1 here
// => program state has changed
// => `reserve` had some effects
}
}
现场演示:https://godbolt.org/z/ee8rYaYW4
标准对这个问题的看法是什么?它是否以某种方式覆盖这些情况?我找不到相关章节。
解决方案
“Effects”是一个专门术语:
[structure.specifications]/3.6 Effects: 函数执行的操作。
因此,当你在库函数定义的“Effects”部分看到“没有副作用”时,意味着该部分在其他地方描述的操作实际上并未被执行。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。