左值 istringstream 需要istream_iterator

Lvalue istringstream Required for istream_iterator?

本文关键字:iterator istream 需要 istringstream 左值      更新时间:2023-10-16

给定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& {aka std::basic_istream<char>& } 的非常量引用无效

现在我知道 gcc 有一个错误,由我们自己的 Jonathan Wakely 修复。这是该错误的扩展,还是我在这里使用 Rvalue istringstream是否违法?

这不是一个 gcc 错误,而是一个邪恶的 MSVC 扩展。 std::istream_iterator::istream_iteraor()需要左值引用。 由于istringstream(foo)是一个临时的 gcc,因此您不能将临时绑定到左值引用。

这在 MSVC 上工作的原因是前面提到的扩展允许临时绑定到左值引用。 这允许不符合标准的代码在 MSVC 上工作。

所以要回答

这是该错误的扩展,还是我在这里使用 Rvalue istringstream是否非法?

不,这不是错误,您需要在此处使用非临时流来构建istream_iterator