给定Visual Studio中的string foo
,我可以通过执行以下操作将这些单词分解为vector
:
vector fooVec{ istream_iterator<string>(istringstream(foo)), istream_iterator<string>() };
但这不会在 gcc 5.1 中编译。我收到错误:
从类型
std::basic_istream<char>
的右值初始化类型std::istream_iterator<std::basic_string<char> >::istream_type&
{akastd::basic_istream<char>&
} 的非常量引用无效
现在我知道 gcc 有一个错误,由我们自己的 Jonathan Wakely 修复。这是该错误的扩展,还是我在这里使用 Rvalue istringstream
是否违法?
这不是一个 gcc 错误,而是一个邪恶的 MSVC 扩展。 std::istream_iterator::istream_iteraor()
需要左值引用。 由于istringstream(foo)
是一个临时的 gcc,因此您不能将临时绑定到左值引用。
这在 MSVC 上工作的原因是前面提到的扩展允许临时绑定到左值引用。 这允许不符合标准的代码在 MSVC 上工作。
所以要回答
这是该错误的扩展,还是我在这里使用 Rvalue
istringstream
是否非法?
不,这不是错误,您需要在此处使用非临时流来构建istream_iterator
。