在Visual Studio中给定string foo
我可以通过执行以下操作将单词划分为vector
:
vector fooVec{ istream_iterator<string>(istringstream(foo)), istream_iterator<string>() };
但这不会在gcc 5.1中编译。我收到错误:
从类型为
的右值开始,对std::istream_iterator<std::basic_string<char> >::istream_type&
std::basic_istream<char>&
{akastd::basic_istream<char>
}类型的非const引用进行无效初始化
现在我知道gcc已a bug由我们自己的Jonathan Wakely修复。这是该bug的扩展还是在我这里使用Rvalue istringstream
是否合法?
答案 0 :(得分:2)
这不是gcc错误,而是evil MSVC extension。 std::istream_iterator::istream_iteraor()
需要左值引用。由于istringstream(foo)
是临时gcc,因此正确告诉您无法将临时值绑定到左值引用。
这适用于MSVC的原因是前面提到的扩展允许临时值绑定到左值引用。这允许非标准兼容代码在MSVC上工作。
所以回答
这是该bug的扩展还是在我这里使用Rvalue
istringstream
是否合法?
这不是一个错误,你需要一个非临时流来构建istream_iterator
。