Search code examples
c++standards-compliancestringstream

Standard behavior of tellp on empty ostringstream


I have a question on the standard behavior of calling tellp on an empty ostringstream. I have a function foo which calls tellp the first thing:

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

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

In Visual Studio 2005, calling this function with a newly created and empty ostringstream results in the pos variable to be set to an invalid pos_type, which in Visual Studio 2005 is set to pos_type(_BADOFF).

ofstream does not have the same behavior, where tellp returns pos_type(0), which is a valid pos_type.

Is this standard conforming behavior? Is this behavior consistent with other compilers?


Solution

  • 27.6.2.4:

    pos_type tellp();
    

    Returns: if fail() != false, returns pos_type(-1) to indicate failure. Otherwise, returns rdbuf()->pubseekoff(0, cur, out).

    And pubseekoff returns -1 on fail. But am not sure why this happens for you in the case of ostringstream, maybe was too tired to find the words about undefined or implementation-dependent. Using my common sense I would say that for ostringstream this should give 0, for default constructed ostream -1, and for ostream with freshly opened file 0.