【问题标题】:Lvalue istringstream Required for istream_iterator?左值 istringstream istream_iterator 需要吗?
【发布时间】:2016-09-29 12:14:27
【问题描述】:

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

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

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

std::basic_istream&lt;char&gt; 类型的右值初始化 std::istream_iterator&lt;std::basic_string&lt;char&gt; &gt;::istream_type&amp; {aka std::basic_istream&lt;char&gt;&amp;} 类型的非常量引用无效

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

【问题讨论】:

    标签: c++ visual-studio istringstream istream-iterator gcc5


    【解决方案1】:

    这不是 gcc 错误,而是evil MSVC extensionstd::istream_iterator::istream_iteraor() 需要左值引用。由于 istringstream(foo) 是一个临时 gcc,因此正确地告诉您不能将临时绑定到左值引用。

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

    所以回答

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

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

    【讨论】:

      猜你喜欢
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      • 2016-09-03
      • 2014-11-18
      • 1970-01-01
      • 2011-09-03
      相关资源
      最近更新 更多