现在允许为std :: string分配一个数字?

Zac*_*Saw 13 c++ gcc

请考虑以下代码段:

#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>

问题:

  1. 为什么代码片段会编译?
  2. 在评论中foo = -1,我得到了正确的标准输出(12).编译器编译的是什么foo = -1;导致后续的couts失败?

R S*_*ahu 11

foo = -1;
Run Code Online (Sandbox Code Playgroud)

解析到std::string::operator=(char)因为-1intint能够在理论上,被转换成一个char.

int不代表有效时,我不清楚标准所说的内容char.看起来在你的实现中,程序崩溃了.

更新

从C++ 11标准(强调我的):

3.9.1基本类型

1声明为characters(char)的对象应足够大,以存储实现的基本字符集的任何成员.如果此组中的字符存储在字符对象中,则该字符对象的整数值等于该字符的单个字符文字形式的值.实现定义char对象是否可以保存负值.

看来你必须查阅编译器的文档,以了解它是否允许char对象保存负值,如果允许,它如何处理这些对象.

  • 还不清楚.-1,据我所知,对于`char`来说,它是一个完全有效的值.即使`char`是无符号的,转换也很明确. (6认同)

n. *_* m. 5

char是C++中的完整类型.std::string定义赋值运算符:

std::string& operator=(char);
Run Code Online (Sandbox Code Playgroud)

由于在这种情况下自由int转换char,因此不给出诊断.(有趣的是,最好的意图如何铺平通往地狱的道路,不是吗?)

由于(char)-1在您的平台上设置了执行字符,因此可能不是有效成员,因此流将进入错误状态并保持不变,直到错误位被清除为止.

编辑这是一个错误的想法.如果输出流包含"非法"字符,则不显示整个流,即使是在坏字符之前生成和刷新的部分.使用其他在线编译器进行检查.