我正在查看一些遗留代码,发现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 逻辑,也许我可以将它放入上面的运算符中。)