我的一位同事今天在我们的代码中发现了一个非常微妙的错误,基本上是这样的:
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
没有(n隐式)构造函数,它带有char
。将它作为显式转换迫使你写
std::string s = string('A');
这将禁止分配到单个_Elem
(char
)。
提供此赋值运算符是否有任何原因?正如同一位同事正确地注意到的那样,
double d;
char c = d;
是允许的,而
int* p = d;
不是(对于任何指针大小) - 可能是因为从数字到指针的隐式转换被认为是危险的。 事实上,它甚至似乎已经进入了C ++ 11,据我所知,它在数据类型管理方面非常严格和有用。
答案 0 :(得分:15)
30年前写过导入std::string
的图书馆的人认为这是一个好主意。
在标准化之前,它没有被删除。
从那以后,删除它会冒破坏遗留代码的风险,这是一种成本。
deprecated
属性最近才添加到C ++中,它允许一种标准方式告诉用户一个函数它很快就会消失。没有人设法让它被弃用,这是一个明智的步骤需要它被删除(只是删除它将是粗鲁的)。我鼓励你提出这样的建议。