为什么`std :: string`的赋值运算符按值而不是`const`引用`char`?

时间:2015-07-06 07:07:51

标签: c++ string c++11 implicit-conversion c++-standard-library

无意中我遇到了以下情况:

int i = 1000;
string s;
s = i; // ok, but value of `s` is not 1000!

这种情况是由string标准库中的以下运算符创建的:

string& string::operator=(_CharT __c) 
{ 
  this->assign(1, __c); 
  return *this;
}

现在,这会产生一种不必要的不​​良影响,偶然我们可能最终将整数分配给string,并带有错误值!
例如,在我的情况下,i早于string,然后我转换为int。代码仍然编译但程序崩溃,因为它对整体代码有明显的不良影响。

如果是这样的话,将避免这种情况:

string& operator=(const _CharT& c);

没有上述版本的动机是什么?

1 个答案:

答案 0 :(得分:2)

  

没有上述版本的动机是什么?

它不能解决问题(它不会影响您的工作方式)而且速度会慢一些。

在大多数体系结构上传递char(或甚至wchar_tchar32_t)比在创建引用然后通过引用访问更快,因为它需要传递指针 - size对象(通常大于char并且在64位系统上可能也大于wchar_t)然后通过指针进行间接处理。

因此,它无法解决您尝试修复的问题,只会使代码变慢。双坏。

C ++允许int转换为char,因此建议的重载只会创建临时的,然后绑定对它的引用。请参阅http://open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#2372以获得更好的“修复”,它有自己的问题,可能不会发生。