1

我正在将一些 C++ 代码从 Unix 移植到 Linux(Red Hat)。

我遇到了以下模式:

ostream& myfunction(ostream& os)
{
  if (os.opfx())
  {
    os << mydata;
    os.osfx();
  }
  return os;
}

在 Red Hat 4.5 下这些功能opfxosfx不可用。我在这里看到了使用该ostream::sentry功能的建议:

ostream& myfunction_ported(ostream& os)
{
  ostream::sentry ok(os);
  if (ok)
  {
    os << mydata;
  }
  return os;
}

我从这里看到 的目的opfx是在刷新并继续之前验证流状态。

我的问题:

我认为这些ostream函数在对流进行操作之前已经检查了流状态。这是真的?这在某些时候不是真的吗?

opfx是否需要更换sentry?什么sentry给了我operator<<尚未给我的东西?

4

1 回答 1

1

任何现有的插入器(除非它真的很糟糕)已经在创建哨兵对象,因此只要您通过现有的插入器完成工作,您就不需要自己创建哨兵对象。

当您自己将数据直接写入流缓冲区时,您确实需要创建一个哨兵对象,而无需任何现有插入器的帮助(即,当您不使用任何其他可以为您创建哨兵的东西时)。

对于此代码,您可以完全消除创建哨兵对象并执行以下操作:

ostream& myfunction(ostream& os)
{
    return os << mydata;
}

请注意,现有代码被声明为返回一个ostream &,但似乎并没有真正返回任何东西。

于 2010-08-13T18:40:39.740 回答