gpt4 book ai didi

c++ - 在 C++ 中用空终止字符串实例化的 istringstream 对象的奇怪行为

转载 作者:搜寻专家 更新时间:2023-10-31 00:38:24 29 4
gpt4 key购买 nike

我在 s 中存储了一个以 null 结尾的字符串,类型为 char*。我想从 s 创建一个 istringstream 对象。由于 istringstream 的构造函数需要一个类型为 string 的参数,因此我需要将 schar* 转换为 字符串。我通过以下方式使用其构造函数从 s 创建一个匿名 string 对象来做到这一点:

istringstream strin(string(s));

这在使用 gcc (4.7.3) 编译时似乎没问题。但是,在我添加以下代码以使用 strin

之后
int r;
strin >> r;

编译错误:

error: invalid operands of types 'std::istringstream(std::string*) {aka std::basic_istringstream<char>(std::basic_string<char>*)}' and 'int' to binary 'operator>>'

这对我来说似乎很奇怪,因为我不明白 std::istringstream(std::string*) 是什么类型。 strin 不应该是 std::istringstream 类型吗?

我可以通过使用以下代码的修改版本之一来让编译器满意。

解决方案 1:传递一个命名的 string 对象

string str(s);
istringstream strin(str);

方案二:直接传s,好像会隐式转换成string

istringstream strin(s);

解决方案3:将s显式转换为string

istringstream strin((string)(s));

解决方案 4:添加一对神奇的括号

istringstream strin((string(s)));

方案五:告诉编译器s确实是char*类型

istringstream strin(string((char*)s));

除原始版本外,所有这些都有效。谁能解释这里到底发生了什么?谢谢。

最佳答案

最烦人的解析又来了:

std::istringstream strin( string( s ) );

声明一个函数 (strin),它接受一个 string 作为参数,并返回一个 std::istringstream。 (一个好的编译器可能会在这里发出警告,因为您不可能实现这样的功能。)更正此问题的最简单方法是添加一些额外的括号:

std::stringstream strin( (string( s )) );

(实际上,这里最简单的解决方案是只写:

std::stringstream strin( s );

并让隐式转换完成这项工作。)

关于c++ - 在 C++ 中用空终止字符串实例化的 istringstream 对象的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18182481/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com