2017-02-13 44 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(反之亦然)。

相關問題