为什么 `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_t
或 char32_t
)比创建引用然后通过引用访问更快,因为它需要传递一个指针大小的对象(通常大于 char
,在 64 位系统上可能也大于 wchar_t
),然后通过指针进行间接寻址。
所以它不会解决您试图解决的问题,只会让代码变慢。双坏.
C++ 允许 int 到 char 的转换,因此您建议的重载只会创建该临时对象,然后将引用绑定到它。请参阅 http://open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#2372 以获得更好的 "fix",它有其自身的问题并且可能不会发生。
无意中遇到了以下情况:
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_t
或 char32_t
)比创建引用然后通过引用访问更快,因为它需要传递一个指针大小的对象(通常大于 char
,在 64 位系统上可能也大于 wchar_t
),然后通过指针进行间接寻址。
所以它不会解决您试图解决的问题,只会让代码变慢。双坏.
C++ 允许 int 到 char 的转换,因此您建议的重载只会创建该临时对象,然后将引用绑定到它。请参阅 http://open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#2372 以获得更好的 "fix",它有其自身的问题并且可能不会发生。