我对C++标准中“无副作用”保证的理解正确吗?

编程语言 2026-07-09

对某些库函数,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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章