istream_iterator 需要左值 istringstream 吗?

Lvalue istringstream Required for istream_iterator?

给定 Visual Studio 中的 string foo 我可以通过以下方式将单词分解为 vector

vector fooVec{ istream_iterator<string>(istringstream(foo)), istream_iterator<string>() };

但这不会在 gcc 5.1 中编译。我收到错误:

invalid initialization of non-const reference of type std::istream_iterator<std::basic_string<char> >::istream_type& {aka std::basic_istream<char>&} from an rvalue of type std::basic_istream<char>

现在我知道 gcc 有 a bug that was fixed by our own Jonathan Wakely。这是该错误的扩展还是我在这里使用 Rvalue istringstream 是非法的?

这不是 gcc 错误,但 evil MSVC extension. std::istream_iterator::istream_iteraor() 需要左值引用。由于 istringstream(foo) 是临时的,gcc 正确地告诉您不能将临时的绑定到左值引用。

这在 MSVC 上起作用的原因是前面提到的允许临时对象绑定到左值引用的扩展。这允许非标准兼容代码在 MSVC 上工作。

所以要回答

Is this an extension of that bug or should it be illegal for me to use an Rvalue istringstream here?

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