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

亚姆米林德

偶然我遇到了以下情况:

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错误地将整数赋给a
例如,在我的情况下i是早先的a string,然后我转换为int该代码仍在编译,但由于其对整体代码的明显不良影响,该程序崩溃了。

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

string& operator=(const _CharT& c);

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

乔纳森·韦克利(Jonathan Wakely)

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

它不能解决问题(您认为它无法正常工作),并且速度会更慢。

在大多数体系结构中,按值传递char(或(或wchar_tchar32_t)值比创建引用然后通过引用进行访问要快,这是因为它需要传递指针大小的对象(char在64位系统上,通常比a大,并且也可能大于a)。大于wchar_t),然后通过指针进行间接操作。

因此,它不能解决您要解决的问题,只会使代码变慢。双坏。

C ++允许将int转换为char,因此建议的重载只会创建该临时文件,然后将对其进行绑定。有关更好的“修复”,请参见http://open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#2372,该修复有其自身的问题,可能不会发生。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么重载的移动赋值运算符返回左值引用而不是右值引用?

来自分类Dev

为什么按值而不是引用返回时不能调用运算符?

来自分类Dev

为什么右值引用类型的赋值不调用移动赋值运算符?

来自分类Dev

为什么赋值运算符=不返回指针的值而是取消引用的值?

来自分类Dev

为什么在重载的流运算符上std :: basic_string <char> segfaulting?

来自分类Dev

为什么我们在赋值运算符重载而不是在正负运算中使用引用返回?

来自分类Dev

为什么我们在赋值运算符重载而不是在正负运算中使用引用返回?

来自分类Dev

std :: string运算符[]如何返回引用而不是字符?

来自分类Dev

为什么std :: string的成员运算符=不等于左值ref限定

来自分类Dev

为什么<< ofstream中的运算符不是const?

来自分类Dev

为什么std :: vector :: push_back需要赋值运算符

来自分类Dev

为什么std :: string str = {}?

来自分类Dev

为什么“自动”将字符串声明为const char *而不是std :: string?

来自分类Dev

为什么“自动”将字符串声明为const char *而不是std :: string?

来自分类Dev

为什么std :: basic_string <char>在我的重载流运算符上出现段错误?

来自分类Dev

使用std :: swap而不是使用'='运算符进行赋值

来自分类Dev

为什么要使用新运算符而不是std :: vector?

来自分类Dev

为什么复合赋值或迭代运算符不适用于解除引用的指针

来自分类Dev

为什么std :: string的const访问器返回引用?

来自分类Dev

为什么std :: string_view比const char *快?

来自分类Dev

为什么用转换运算符输出类对std :: string不起作用?

来自分类Dev

为什么在std :: string上使用Sizeof运算符会产生意外结果?

来自分类Dev

为什么std :: vector <char>比std :: string快?

来自分类Dev

为什么std :: string不是std :: vector的特化?

来自分类Dev

为什么我需要写“ std :: string”而不是“ std :: getline()”?

来自分类Dev

使用postfix运算符而不是赋值运算符的优点/局限性是什么?

来自分类Dev

为什么`std :: pair`将`std :: tuple`作为ctor参数类型而不是`const std :: tuple&`?

来自分类Dev

为什么std :: not1()通过const引用而不是值来接受参数?

来自分类Dev

为什么三元(?:)运算符中的std :: istringstream解析为与std :: ifstream不同?

Related 相关文章

  1. 1

    为什么重载的移动赋值运算符返回左值引用而不是右值引用?

  2. 2

    为什么按值而不是引用返回时不能调用运算符?

  3. 3

    为什么右值引用类型的赋值不调用移动赋值运算符?

  4. 4

    为什么赋值运算符=不返回指针的值而是取消引用的值?

  5. 5

    为什么在重载的流运算符上std :: basic_string <char> segfaulting?

  6. 6

    为什么我们在赋值运算符重载而不是在正负运算中使用引用返回?

  7. 7

    为什么我们在赋值运算符重载而不是在正负运算中使用引用返回?

  8. 8

    std :: string运算符[]如何返回引用而不是字符?

  9. 9

    为什么std :: string的成员运算符=不等于左值ref限定

  10. 10

    为什么<< ofstream中的运算符不是const?

  11. 11

    为什么std :: vector :: push_back需要赋值运算符

  12. 12

    为什么std :: string str = {}?

  13. 13

    为什么“自动”将字符串声明为const char *而不是std :: string?

  14. 14

    为什么“自动”将字符串声明为const char *而不是std :: string?

  15. 15

    为什么std :: basic_string <char>在我的重载流运算符上出现段错误?

  16. 16

    使用std :: swap而不是使用'='运算符进行赋值

  17. 17

    为什么要使用新运算符而不是std :: vector?

  18. 18

    为什么复合赋值或迭代运算符不适用于解除引用的指针

  19. 19

    为什么std :: string的const访问器返回引用?

  20. 20

    为什么std :: string_view比const char *快?

  21. 21

    为什么用转换运算符输出类对std :: string不起作用?

  22. 22

    为什么在std :: string上使用Sizeof运算符会产生意外结果?

  23. 23

    为什么std :: vector <char>比std :: string快?

  24. 24

    为什么std :: string不是std :: vector的特化?

  25. 25

    为什么我需要写“ std :: string”而不是“ std :: getline()”?

  26. 26

    使用postfix运算符而不是赋值运算符的优点/局限性是什么?

  27. 27

    为什么`std :: pair`将`std :: tuple`作为ctor参数类型而不是`const std :: tuple&`?

  28. 28

    为什么std :: not1()通过const引用而不是值来接受参数?

  29. 29

    为什么三元(?:)运算符中的std :: istringstream解析为与std :: ifstream不同?

热门标签

归档