请考虑以下代码段:
#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;
}
Run Code Online (Sandbox Code Playgroud)
实际输出(ideone.com C++ 14模式和GCC 4.8.4):
<no output>
问题:
foo = -1,我得到了正确的标准输出(1和2).编译器编译的是什么foo = -1;导致后续的couts失败?R S*_*ahu 11
foo = -1;
Run Code Online (Sandbox Code Playgroud)
解析到std::string::operator=(char)因为-1是int和int能够在理论上,被转换成一个char.
当int不代表有效时,我不清楚标准所说的内容char.看起来在你的实现中,程序崩溃了.
更新
从C++ 11标准(强调我的):
3.9.1基本类型
1声明为characters(
char)的对象应足够大,以存储实现的基本字符集的任何成员.如果此组中的字符存储在字符对象中,则该字符对象的整数值等于该字符的单个字符文字形式的值.实现定义char对象是否可以保存负值.
看来你必须查阅编译器的文档,以了解它是否允许char对象保存负值,如果允许,它如何处理这些对象.
char是C++中的完整类型.std::string定义赋值运算符:
std::string& operator=(char);
Run Code Online (Sandbox Code Playgroud)
由于在这种情况下自由int转换char,因此不给出诊断.(有趣的是,最好的意图如何铺平通往地狱的道路,不是吗?)
由于(char)-1在您的平台上设置了执行字符,因此可能不是有效成员,因此流将进入错误状态并保持不变,直到错误位被清除为止.
编辑这是一个错误的想法.如果输出流包含"非法"字符,则不显示整个流,即使是在坏字符之前生成和刷新的部分.使用其他在线编译器进行检查.
| 归档时间: |
|
| 查看次数: |
852 次 |
| 最近记录: |