我对在空tellp
上调用ostringstream
的标准行为有疑问。我有一个函数foo,它首先调用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
,在Visual Studio 2005中设置该变量到pos_type(_BADOFF)
。
ofstream
没有相同的行为,其中tellp
返回pos_type(0)
,这是有效的pos_type
。
这个标准符合行为吗?这种行为是否与其他编译器一致?
答案 0 :(得分:1)
27.6.2.4:
pos_type tellp();
返回:如果fail()!= false,则返回 pos_type(-1)表示失败。 否则,返回 rdbuf() - > pubseekoff(0, cur , out )。
pubseekoff 在失败时返回-1。但是我不确定为什么在 ostringstream 的情况下会发生这种情况,可能太累了,无法找到关于 undefined 或依赖于实现的的字样。根据我的常识,我会说对于 ostringstream ,对于默认构造的ostream -1,这应该给0,对于新打开的文件0,应该给ostream。