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

时间:2015-02-10 16:16:56

标签: c++ c++11

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

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

这将禁止分配到单个_Elemchar)。

提供此赋值运算符是否有任何原因?正如同一位同事正确地注意到的那样,

double d;
char c = d;

是允许的,而

int* p = d;

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

1 个答案:

答案 0 :(得分:15)

30年前写过导入std::string的图书馆的人认为这是一个好主意。

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

从那以后,删除它会冒破坏遗留代码的风险,这是一种成本。

deprecated属性最近才添加到C ++中,它允许一种标准方式告诉用户一个函数它很快就会消失。没有人设法让它被弃用,这是一个明智的步骤需要它被删除(只是删除它将是粗鲁的)。我鼓励你提出这样的建议。