我对以下标记字符串的代码有疑问(用空格分隔标记)。
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string s="And I feel fine ...";
istringstream ss(s);
vector<string> tokens{istream_iterator<string>(ss),{}};
for(auto& elem: tokens)
cout << elem << endl;
}
这工作得很好。另一方面,如果我尝试通过临时istringstream
反对istream_iterator
(第 3 行内main
), 例如
vector<string> tokens{istream_iterator<string>(istringstream(s)),{}};
我收到编译时错误error: no matching conversion for functional-style cast from 'istringstream' (aka 'basic_istringstream<char>') to 'istream_iterator<string>'
我相信这是因为我无法将临时右值绑定到非常量左值引用,并且构造函数istream_iterator
将引用作为参数。有没有什么方法可以构建一个istream_iterator<string>
从临时的?我无法使用std::ref
在临时对象上...
Thanks!
Use the std::skipw
trick:
std::vector<std::string> tokens{
std::istream_iterator<std::string>(std::istringstream(s) >> std::skipws), {}
};
这是有效的,因为提取器返回对流的左值引用,并且设置std::skipw
不会有任何影响,因为它默认在所有流上启用。要在一般情况下使用它,您需要一个接受通用引用的函数,然后返回对该对象的引用:
template<typename T>
T& lvalue(T&& x)
{
return x;
}
// ...
std::istream_iterator<std::string>(lvalue(std::istringstream(s)));
确保引用没有在完整表达式之后使用,否则您将有一个悬空引用,因为临时引用已经被破坏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)