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

Why `std::string`'s assignment operator take `char` by value and not `const` reference?

无意中遇到了以下情况:

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);

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

What is the motivation behind not having above version?

它没有解决问题(它不像你想象的那样工作)而且会更慢。

在大多数体系结构上,按值传递 char(甚至 wchar_tchar32_t)比创建引用然后通过引用访问更快,因为它需要传递一个指针大小的对象(通常大于 char,在 64 位系统上可能也大于 wchar_t),然后通过指针进行间接寻址。

所以它不会解决您试图解决的问题,只会让代码变慢。双坏.

C++ 允许 int 到 char 的转换,因此您建议的重载只会创建该临时对象,然后将引用绑定到它。请参阅 http://open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#2372 以获得更好的 "fix",它有其自身的问题并且可能不会发生。