いくつかのレガシーコードを調べたところ、コード全体で一時オブジェクトが自由に使用されており、次のコードを強制的に使用するよう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ロジックをいくつか見たので、これを上のオペレーターに配置できます。)