0

在 Visual Studio 中给定 astring foo我可以通过执行以下操作将单词分解为 a vector

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

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

从类型的右值对类型std::istream_iterator<std::basic_string<char> >::istream_type&{aka }的非常量引用的无效初始化std::basic_istream<char>&std::basic_istream<char>

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

4

1 回答 1

2

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

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

所以来回答

这是该错误的扩展还是我在istringstream这里使用右值是非法的?

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

于 2016-05-31T13:03:27.070 回答