给定相同的索引,iword()和pword()是否保证引用单独的基础值?

时间:2017-02-13 04:59:12

标签: c++ c++11 iostream xalloc

在标准C ++ ios库中,是否保证&stream.iword(ind) != &stream.pword(ind)在具有相同stream值的同一ind上进行调用?

此外,是否可以保证我可以单独使用相同索引的void*long值(即它们未被实现为联合等)?

我认为这里的X-Y问题是如何知道,如果给定一个随机流,我的自定义值("分配"使用xalloc())是否已被初始化?我问,因为我已经看到人们使用pword()检查一个魔术常数,然后iword()初始化该值,如果前一个条件失败。

我主要关心的是C ++ 11及其后续版本,但欢迎任何相关的历史信息。

1 个答案:

答案 0 :(得分:1)

C ++标准规定iword()pword()应该表现得好像它们正在操纵两个独立的独立存储块 - 而不是像一个块,其内容被解释为{{1有时和long其他时间。

  

<强> [ios.base]

void*
  

<强> [ios.base.storage] / 3

namespace std {
  class ios_base {
  // ...
  private:
    long* iarray; // exposition only
    void** parray; // exposition only
  };
}
     

效果:如果 long& iword(int idx); 是空指针,则分配一个未指定大小的iarray数组,并在long中存储指向其第一个元素的指针。然后,该函数根据需要扩展iarray指向的数组,以包含元素iarray。每个新分配的数组元素都初始化为零。在对象上执行任何其他操作后返回的引用无效。但是,保留所引用存储的值,以便在下一次调用iarray[idx]之前,使用相同索引调用copyfmt会产生对同一值的另一个引用...

[ios.base.storage] / 5 重复完全相同的措辞,用iword代替pwordiword代替parrayiarray的{​​{1}}。

重要的部分是&#34;存储的价值......被保留&#34; - 具有给定索引的后续void*调用应该看到写入存储的值,前一个long调用具有相同索引的引用提供了引用,而不管中间方法调用(除了{之外) {1}}),即使干预方法调用是iword(反之亦然)。