4

tellp空の を呼び出す標準的な動作について質問がありますostringstreamtellp最初のものを呼び出す関数 foo があります。

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 では、新しく作成された空の変数を使用してこの関数を呼び出すとostringstreampos変数が無効pos_typeに設定されます。これは、Visual Studio 2005 では に設定されpos_type(_BADOFF)ます。

ofstreamは同じ動作をしません。ここで、有効な をtellp返します。pos_type(0)pos_type

これは標準に準拠した動作ですか? この動作は他のコンパイラと一貫していますか?

4

1 に答える 1

1

27.6.2.4:

pos_type tellp();

戻り値: fail() != false の場合、失敗を示すために pos_type(-1) を返します。それ以外の場合は、rdbuf()->pubseekoff(0, cur , out ) を返します。

pubseekoffは、失敗すると -1 を返します。しかし、 ostringstreamの場合になぜこれが起こるのかはわかりません。おそらくundefinedまたはimplementation-dependentについての言葉を見つけるのに疲れていたのでしょう。私の常識では、ostringstreamの場合は 0、デフォルトで構築された ostream の場合は -1、新しく開かれたファイルの ostream の場合は 0 になるはずです。

于 2009-02-08T23:45:00.187 に答える