2011-10-17 30 views
4

我正在創建自己的streambuf子類,並使用C++ 03規範(ISO/IEC 14882:2003)作爲參考。古怪C++ 03 seekoff()和seekpos()規範

在第27.5.2.4.2 [lib.streambuf.virt.buffer],規格爲既basic_streambuf::seekoff()basic_streambuf::seekpos()說:

默認行爲:返回pos_type(off_type(-1)) 。現在

,我以爲off_type被認爲是一個有符號整數類型和pos_type應該是一個無符號整型,所以在我看來,這種表達必須只相當於pos_type(-1)

但是假設我錯了,這些類型可能是其他簽名和未簽名的組合......然後我仍然無法弄清楚這個雙重演員的任何可能用法。

例如,如果兩者都有符號,則該表達式再次等於pos_type(-1)

如果pos_type簽署和off_type是無符號 - 這是沒有意義的,但忍耐一下 - 然後在最好的這雙投會推一些巨大的價值爲pos_type在最壞的情況將通過分配調用實現定義的行爲對已簽署的pos_type整數的值太大。

有沒有人知道在這裏指定pos_type(off_type(-1))而不是僅僅是pos_type(-1)的標準的基本原理?如果不是,你甚至可以想象一個合理的理由嗎?

+1

以下段落在[fpos.operations]一節中:返回類型traits :: pos_type的值的流操作返回P(O(-1))作爲無效值到 表示發生錯誤。如果此值用作任何istream,ostream或streambuf成員的參數,該成員 接受類型traits :: pos_type的值,則該函數的行爲未定義。 ---也許你可以理解本節的其餘部分,這是我理解的唯一部分。 – Patrick

+0

@帕特里克:是的,那部分確實是關鍵。 (請參閱接受的答案和我的評論。)謝謝! – Nemo

回答

4

相信pos_type默認歸結爲一個std::streampos,這通常是這樣定義:

typedef fpos<mbstate_t> streampos;

std::fpos通常是偏移結合多字節狀態對象。

此外,off_type默認會歸結爲一個std::streamoff這也是一個符號整數類型(long或類似的東西)

所以我認爲這裏的思路是,你可以初始化一個偏移類型與-1值,那麼可以用來初始化一個位置對象,這是一個更復雜的對象。因爲,fpos的構造函數需要streamoff類型,而不是long,如果streamoff可能是比long或類似的更復雜的類型,它會使謹慎性變得非常必要。

想象一個streamoff是這樣定義的實現:

struct streamoff { 
    explicit streamoff(long offset); 
    // rest of the stuff here... 
}; 

然後,只需pos_type(-1)是行不通的,因爲就沒有隱式轉換。

所以我認爲這只是謹慎。

+0

謝謝你的;我不知道'streampos'可以是一個結構。但是,如果'off_type'是一個帶符號的整數類型,則將其初始化爲-1並不會給出「最大可能值」。 (的確,如果'off_type'是一個帶符號的整數類型,那麼即使'streampos'是一個結構,我也不會看到'off_type(-1)'和'-1'在實際中可能會有所不同。' – Nemo

+0

對不起,這不是最大的,我會糾正我的答案。 –

+0

啊,我明白了。這些類型根本不需要是整數;他們只需要遵守表88(第27.4.3.2節,[lib.fpos.operations])中規定的要求。所以他們都可以是結構。這回答了我的問題;謝謝! – Nemo