3

いくつかのレガシーコードを調べたところ、コード全体で一時オブジェクトが自由に使用されており、次のコードを強制的に使用するようstd::stringに変換されていることがわかりました。const char*

inline std::ostream & operator << (std::ostream & s, const std::string & str)

その中でstr.c_str()、への呼び出しを実行するために使用されます

template<class _Traits> inline
    basic_ostream<char, _Traits>& __CLRCALL_OR_CDECL operator<<(
        basic_ostream<char, _Traits>& _Ostr,
        const char *_Val)

奇妙なことに、これは誰かが繰り返したconst char *挿入演算子を作成したためだと思います...とにかく理由は薄暗い過去に失われました...何が起こっているかに正確に気づいたときにそれを削除し、すべてが機能します(AFAIK) 。

この問題を実験している間、私operator<<(std::ostream& , const char*)は次のことを行うように再定義しました。

//
// Disclaimer - experiment!!! not enshrined in code.
//
inline std::ostream & operator << (std::ostream & s, const char * str)
{
   //formerly return s << std::string(str);

   if( str ) s.rdbuf()->sputn( str , strlen(str) );
   return s;
}

呼び出し(一部のコメントを先取りする)とは 別にstrlen、挿入演算子をバイパスすることには多くの欠点がありますか?(バイパスしているオペレーターでtry catchロジックをいくつか見たので、これを上のオペレーターに配置できます。)

4

1 に答える 1

1

ストリームインサーターはフォーマットされた入力を行い、ストリームオブジェクト内の2つのフラグによって制御されます。文字を出力バッファに直接詰め込むと、このフォーマットがバイパスされるため、のようなマニピュレータsetwは出力に影響を与えません。

于 2012-11-12T15:19:16.013 に答える