为什么可以将整数分配给字符串变量?

时间:2018-09-21 01:26:09

标签: c++ visual-studio type-conversion stdstring

在Visual Studio 2013中,如果我写以下内容,编译器将报告错误:

std::string test = 3; 

显示:

  

错误C2440:“正在初始化”:无法从“ int”转换为   'std :: basic_string,std :: allocator>'。

但是,如果我将其更改为:

std::string test = "";
test = 3; 

它只是编译!当然会导致悲剧性的错误。

为什么会发生这种情况?

2 个答案:

答案 0 :(得分:7)

这是因为我们有以下赋值运算符:

basic_string& operator=( CharT ch )

see cppreference

在这种情况下, 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分配

charint可隐式转换为char。