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
。
给定 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&
{akastd::basic_istream<char>&
} from an rvalue of typestd::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
。