在Visual Studio 2013中,如果我写以下内容,编译器将报告错误:
std::string test = 3;
显示:
错误C2440:“正在初始化”:无法从“ int”转换为 'std :: basic_string,std :: allocator>'。
但是,如果我将其更改为:
std::string test = "";
test = 3;
它只是编译!当然会导致悲剧性的错误。
为什么会发生这种情况?
答案 0 :(得分:7)
这是因为我们有以下赋值运算符:
basic_string& operator=( CharT ch )
在这种情况下, int 转换为 char 。
这受制于defect report 2372: Assignment from int to std::string,该{@ 3}被视为不是缺陷(NAD)而被关闭。它说:
以下代码在C ++中有效:
int i = 300; std::string threeHundred; threeHundred = i;
“ Works” ==“正在编译并且没有未定义的行为”。但它 可能并不明显,而且实际上会误导其功能。 此 分配将int转换为char,然后使用字符串的分配 来自char 。虽然char的分配可以视为一项功能, 能够从int进行赋值看起来像一个安全漏洞。有人可能 相信C ++的工作方式类似于“动态类型”语言,并且期望 进行词汇转换。
理想情况下,可以弃用char的赋值,以后再使用 删除了,但作为一种不太麻烦的选择,可以考虑添加 一个SFINAEd删除的功能模板:
template <typename IntT> // enable if is_integral<IntT>::value basic_string& operator=(IntT) = delete;
,分辨率为:
这应该通过给LEWG的论文来解决
答案 1 :(得分:0)
String
分配 char
。 int
可隐式转换为char。