在标准C ++ ios
库中,是否保证&stream.iword(ind) != &stream.pword(ind)
在具有相同stream
值的同一ind
上进行调用?
此外,是否可以保证我可以单独使用相同索引的void*
和long
值(即它们未被实现为联合等)?
我认为这里的X-Y问题是如何知道,如果给定一个随机流,我的自定义值("分配"使用xalloc()
)是否已被初始化?我问,因为我已经看到人们使用pword()
检查一个魔术常数,然后iword()
初始化该值,如果前一个条件失败。
我主要关心的是C ++ 11及其后续版本,但欢迎任何相关的历史信息。
答案 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
代替pword
,iword
代替parray
, iarray
的{{1}}。
重要的部分是&#34;存储的价值......被保留&#34; - 具有给定索引的后续void*
调用应该看到写入存储的值,前一个long
调用具有相同索引的引用提供了引用,而不管中间方法调用(除了{之外) {1}}),即使干预方法调用是iword
(反之亦然)。