2017-02-13 42 views
1

在标准C++ ios库中,是否保证&stream.iword(ind) != &stream.pword(ind)在同一个stream上调用时具有相同的ind值?鉴于相同的索引,是否iword()和pword()保证引用单独的基础值?

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

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

我主要关心C++ 11及以后的版本,尽管欢迎任何相关的历史信息。

+0

当你调用'pword()'时,'iword()'返回的引用无效,所以我不确定地址是否可以进行有意义的比较。 – Cornstalks

+0

@Cornstalks有趣;它是如何失效?你的意思是你可以使用'pword()'或'iword()',但不能同时使用? – Qix

+0

以下是一些关于['iword'](http://en.cppreference.com/w/cpp/io/ios_base/iword)和['pword'](http:/ /en.cppreference.com/w/cpp/io/ios_base/pword)。对于这两种方法,请注意句子*“引用可能会因此'ios_base'对象[*]”*上的任何操作而失效。你可以使用任何一个,但是一旦你调用下一个函数,你需要放弃旧的引用,不再使用它。想想它就像是在一个'std :: vector'中获取一个对象的地址。这很好,但是一旦你调用'push_back',那个地址就会失效。 – Cornstalks

回答

1

C++标准说iword()pword()应该表现为,如果他们正在操纵两个单独的,存储的独立块 - 而不是说,一个单独的块,其内容被解释为long有时和其它void*倍。

[ios.base]

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

[ios.base.storage]/3

long& iword(int idx); 

短跑运动员ts:如果iarray是空指针,则分配一个未指定大小的long的数组,并在iarray中存储指向其第一个元素的指针。该功能然后根据需要扩展iarray指向的数组以包括元素iarray[idx]。数组中每个新分配的元素都被初始化为零。返回的引用在该对象的任何其他操作之后无效。然而,存储的值称为被保留,使得,直到下一个呼叫到copyfmt,调用iword具有相同索引产生另一个参考为相同的值...

[ios.base.storage ]/5重复完全相同的措辞,用pword代替iword,parray代替iarrayvoid*代替long

重要的部分是“存储...的价值被保留” - 随后的具有给定索引的iword调用应该看到写入存储器的值,以前的iword使用相同索引调用时提供了参考,不管介入方法调用(copyfmt除外),即使该干预方法调用是pword(反之亦然)。

相关问题