gpt4 book ai didi

c++ - 为什么字符串支持 `operator=(char)` ?

转载 作者:IT老高 更新时间:2023-10-28 22:04:38 25 4
gpt4 key购买 nike

我的一位同事今天在我们的代码中发现了一个非常微妙的错误,基本上是这样的:

double d = 65;
std::string s = "Hello world";

// .. somewhere later, accidentally assigning to s instead of a similarly
// named numerical variable.
s = d;

// s is now 'A'

我发现这个错误发生的原因是 std::basic_string<_Elem>有一个赋值运算符

_Myt& operator=(_Elem _Ch)
{ // assign 1 * _Ch
return (assign(1, _Ch));
}

现在编译器并没有真正提示(很多,如果级别足够高,它会发出关于缩小转换的警告)。似乎我们很早就发现了这个错误,它并没有造成太大的损害,但我想知道为什么允许这样做。毕竟我不会写

std::string s = 65;

因为 std::string没有采用 char 的 (n 隐式) 构造函数.让它成为一个强制你写的显式转换不是更安全吗

std::string s = string('A');

这将禁止分配给单个 _Elem (char)。

提供这个赋值运算符有什么原因吗?正如同一位同事正确注意到的那样,

double d;
char c = d;

是允许的,而

int* p = d;

不是(对于任何指针大小)-大概是因为从数字到指针的隐式转换被认为是危险的。事实上,它甚至似乎已经进入了 C++11,据我所知,它试图在数据类型管理方面非常严格和有帮助。

最佳答案

30 年前,有人编写了导入 std::string 的库,他认为这是个好主意。

在标准化之前它没有被删除。

从那时起,删除它可能会破坏遗留代码,这是一种成本。

deprecated 属性是最近才添加到 C++ 中的,它允许以标准方式告诉函数的用户它很快就会消失。没有人设法使其弃用,这是在将其删除之前所需的明智步骤(仅删除它是不礼貌的)。我鼓励你提出这样的建议。

关于c++ - 为什么字符串支持 `operator=(char)` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28436477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com