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

流插入器执行格式化输入,由流对象中的几个标志控制。将字符直接填充到输出缓冲区会绕过这种格式,因此像这样setw的操纵器不会影响输出。

于 2012-11-12T15:19:16.013 回答