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

why an integer can be assigned to a string variable?

本文关键字:字符串 变量 分配 整数 为什么      更新时间:2023-10-16

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

std::string test = 3; 

展示:

错误 C2440:"正在初始化":无法从"int"转换为 'std::basic_string,std::分配器>'。

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

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

它只是编译!当然会以悲剧性错误告终。

为什么会发生这种情况?

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

basic_string& operator=( CharT ch )

请参阅 CPP 首选项。

在这种情况下,int转换为字符

这受缺陷报告 2372 的约束:从 int 到 std::string 的分配,该分配因非缺陷 (NAD( 而关闭。它说:

以下代码适用于C++:

int i = 300;
std::string threeHundred;
threeHundred = i;

"工作" == "编译并且没有未定义的行为"。但它 可能并不明显,实际上会误导它的作用。这 赋值将 int 转换为字符,然后使用字符串的赋值 从夏尔。虽然来自 char 的赋值可以被视为一项功能, 能够从 int 进行分配看起来像一个安全漏洞。有人可能会 相信C++像"动态类型"语言一样工作,并期望 进行词法转换。

理想情况下,char 的赋值可以弃用,以后再 删除,但作为侵入性较小的替代方案,可以考虑添加 一个 SFINAEd 删除的函数模板:

template <typename IntT> // enable if is_integral<IntT>::value
basic_string& operator=(IntT) = delete;

决议是:

这应该通过写给LEWG的论文来解决

String可从char分配。int隐式转换为字符。