Стандартное поведение Tellp на пустом Ostringstream - PullRequest
3 голосов
/ 08 февраля 2009

У меня вопрос о стандартном поведении вызова 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.

Это стандартное поведение? Соответствует ли это поведение другим компиляторам?

1 Ответ

1 голос
/ 09 февраля 2009

27.6.2.4:

pos_type tellp();

Возвращает: если fail ()! = False, возвращает pos_type (-1) для обозначения ошибки. В противном случае возвращает rdbuf () -> pubseekoff (0, cur , out ).

И pubseekoff возвращает -1 при ошибке. Но я не уверен, почему это происходит для вас в случае ostringstream , возможно, он слишком устал, чтобы найти слова о undefined или зависящих от реализации . Исходя из здравого смысла, я бы сказал, что для ostringstream это должно дать 0, для построенного по умолчанию ostream -1 и для ostream с только что открытым файлом 0.

...