c++ - 使用临时字符串构建 istringstream

标签 c++ stl iostream

在尝试我的代码回答另一个问题时,我发现以下内容无法编译

#include <iostream>
#include <cstring>
#include <sstream>
#include <string>

using namespace std;

// (main omitted)
const char * coin = "3D";
istringstream ss(string(s));
int i;
ss >> hex >> i;              <--- error here
cout << (char) i << endl;

由于以下错误而失败:

test.cpp:15:11: error: invalid operands of types ‘std::istringstream(std::string) {aka std::basic_istringstream<char>(std::basic_string<char>)}’ and ‘std::ios_base&(std::ios_base&)’ to binary ‘operator>>’

虽然以下代码编译并正确运行:

const char* coin = "3D";
string s(coin);
istringstream ss(s); // or directly istringstream ss("3D")
int i;
ss >> hex >> i;              
cout << (char) i << endl;

如果我看一下 istringstream 的构造函数的定义,它接受const std::string& (实际上是 basic_string<char> 等效项),并且可以编译。所以我猜模板参数推导有一种我不理解的行为,并创建了一个不太符合的 istringstream , 但为什么 ?

我正在使用 GCC 4.6.1(Ubuntu 风格)。

编辑:由于 istringstream 是一个 typedef,我怀疑模板最终是否有任何问题。

最佳答案

istringstream ss(string(s));

您的编译器认为这是一个采用string(名为s)并返回istringstream的函数声明。将参数括在括号中以消除歧义。顺便问一下,s 是什么?您指的是那里的coin吗?

istringstream ss( (string(coin)) );

阅读this如果您感到困惑。

在这种特殊情况下,您当然可以这样做:

istringstream ss(coin);

如果您的编译器支持它,您还可以使用统一初始化语法来避免 MVP:

istringstream ss{string{coin}};

这对大多数人来说可能看起来有点奇怪,我知道这对我来说看起来很奇怪,但这只是因为我已经习惯了旧语法。

关于c++ - 使用临时字符串构建 istringstream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9611230/

相关文章:

c++ - Windows C++组播发送

c++ - 使用 boost::random 并获得相同的数字序列

C++ 模板查询

c++ - 自定义输入迭代器

c++ - 在静态对象的析构函数中使用 cout

c# - 通过套接字将 C# 结构发送到 C++

c++ - -I 在 makefile 中标记不会导致找到头文件

c++ - 包含任意类型的任意 STL 容器的函数模板

c++ - 遍历字符串时 Stringstream 不起作用

C++ ostream 重载不起作用