2009-02-08 61 views
3

我對空的ostringstream調用tellp的標準行爲有疑問。我有一個函數foo它調用tellp的第一件事:關於空ostringstream上的tellp的標準行爲

void foo(std::ostream& os) 
{ 
    std::ostream::pos_type pos = os.tellp(); 
    // do some stuff. 
} 

int main() 
{ 
    std::ostringstream os; 
    foo(os); 
} 

在Visual Studio 2005中,呼籲用新創建的空ostringstream導致pos變量此功能被設置爲無效pos_type,這在視覺Studio 2005設置爲pos_type(_BADOFF)

ofstream沒有相同的行爲,其中tellp回報pos_type(0),這是一個有效pos_type

這是標準符合行爲嗎?這種行爲是否與其他編譯器一致?

+0

在代碼塊IDE中,pos設置爲0,因爲在MSVC++ 6.0 IDE是-1 – CppLearner 2012-04-20 10:02:04

回答

1

27.6.2.4:

pos_type tellp(); 

返回:如果失敗()=假,返回 pos_type(-1),以指示失敗。 否則,返回 rdbuf() - > pubseekoff(0,現在,)。

and pubseekoff在失敗時返回-1。但我不知道爲什麼這種情況發生在ostringstream的情況下,可能太累了,找不到undefined執行相關的。使用我的常識我會說,對於ostringstream這應該給0,爲默認構建的ostream -1,併爲ostream與新打開的文件0.

+0

我同意這應該給0'ostringstream`,所以我想這是VS2005的C++標準庫中的一個錯誤。 – dalle 2009-09-17 07:06:13