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

Assigning a number to std::string is now allowed?

本文关键字:数字 一个 分配 string std      更新时间:2023-10-16

请考虑以下代码片段:

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

<无输出>

问题:

  1. 为什么要编译代码片段?
  2. 注释掉foo = -1,我得到了正确的标准输出(12(。编译器用什么foo = -1;编译导致后续cout失败?
foo = -1;

解析为std::string::operator=(char),因为-1int,理论上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会在你的情况下弄乱完整的输出流。

相关文章: