现在允许为 std::string 分配一个数字
Assigning a number to std::string is now allowed?
请考虑以下代码片段:
#include <iostream>
int main() {
std::string foo;
foo = -1; // why is the compiler not complaining about this?
std::cout << "1" << std::endl;
std::cout << foo << std::endl;
std::cout << "2" << std::endl;
}
实际输出(ideone.com C++14 模式和 GCC 4.8.4(:
<无输出>无输出>
问题:
- 为什么要编译代码片段?
- 注释掉
foo = -1
,我得到了正确的标准输出(1
和2
(。编译器用什么foo = -1;
编译导致后续cout
失败?
foo = -1;
解析为std::string::operator=(char)
,因为-1
是int
,理论上int
可以转换为char
。
当int
不代表有效的char
时,我不清楚标准说了什么.看起来在您的实现中,程序崩溃了。
更新
来自 C++11 标准(强调我的(:
3.9.1 基本类型
1 声明为字符(
char
(的对象应足够大,以存储实现的基本字符集的任何成员。如果此集中的字符存储在字符对象中,则该字符的整数值 Object 等于该字符的单个字符文本形式的值。char 对象是否可以保存负值是实现定义的。
您似乎必须查阅编译器的文档,以了解它是否允许char
对象保存负值,如果是,它如何处理此类对象。
char
是C++中的整数类型。 std::string
定义赋值运算符:
std::string& operator=(char);
由于int
在这种情况下可以自由地转换为char
,因此没有给出诊断。(有趣的是,最好的意图是如何铺平通往地狱的道路的,innit?
由于在您的平台上设置了执行字符,(char)-1
可能不是有效成员,因此流将进入错误状态并停留在那里,不输出任何内容,直到清除错误位。
编辑 这是 ideone 的错误。如果输出流包含"非法"字符,则不会显示整个流,甚至在坏字符之前生成和刷新的部分也不会显示。使用另一个联机编译器进行检查。
这些是字符串类的运算符 = 重载 :-
basic_string& operator=(const basic_string& str);
basic_string& operator=(basic_string&& str) noexcept(allocator_traits<Allocator>::propagate_on_container_move_assignment::value || allocator_traits<Allocator>::is_always_equal::value);
basic_string& operator=(const charT* s);
basic_string& operator=(charT c);
basic_string& operator=(initializer_list<charT>);
希望这是有道理的,为什么编译得很好。
现在来谈谈你的问题,为什么没有输出。我对代码进行了一些调整:-
#include <iostream>
int main() {
std::string foo;
foo = -1; // why is the compiler not complaining about this?
char ch = 65;
std::cout << "1" << std::endl;
std::cout << foo << std::endl;
std::cout << ch << std::endl;
//change ch to -1 ... ascii
ch = -1;
std::cout << ch << std::endl;
std::cout << "2" << std::endl;
}
你能猜出输出是什么吗?是的,从ascii的角度思考:-
1
A
2
这正是您没有 -1 输出的原因。
编译器 - MinGW - std=c++14 - 不知道为什么IDEONE会在你的情况下弄乱完整的输出流。
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何获取一个数字的前3位
- 我想做一个彼此不同但重复出现的数字
- 如何检查一个c++字符串中有多少相同的字符/数字
- 为什么有时我输入一个整数,程序将第一个输入的数字打印成十进制数?
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- CIN 仅在输入非数字值时跳过下一个 CIN
- 以C++输出一个数字三角形
- 形成一个斐波那契三角形,使得每个数字是上面左对角线或右对角线上两个数字的总和
- 为什么当我输入一个被接受的数字时,我的 do-while 循环没有中断?
- 一个C++程序,用于在输入位数时输出具有特定位数的 .txt 文件中的所有数字
- 在C++中编程,将 3 个数字发送到一个函数,然后计算这 3 个数字的平均函数
- 在使用堆栈为下一个最大数字编写代码时面临 SIGSEGV(分段错误)
- 找到 x^n 的所有组合,并检查它们的总和是否等于一个不包括相同数字的数字
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- 将数字提高到一个巨大的指数
- 反转一个数字程序不起作用,为什么?
- 使用带有一个参数函数的递归找到数字的平方
- 为什么当我输入一个大数字时,输出会一遍又一遍地重复?
- 为什么断点显示数组的第二个值是一个大数字?额外学分工作