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 }の非 const 参照の無効な初期化std::basic_istream<char>&std::basic_istream<char>

gccにバグがあり、私たち自身のJonathan Wakelyによって修正されたことがわかりました。istringstreamこれはそのバグの拡張ですか、それともここで Rvalue を使用することは違法ですか?

4

1 に答える 1

2

これは gcc のバグではなく、悪質な MSVC 拡張機能です。 std::istream_iterator::istream_iteraor()左辺値参照が必要です。一時的なgccであるためistringstream(foo)、一時的なものを左辺値参照にバインドできないことが正しく通知されます。

これが MSVC で機能する理由は、前述の拡張により、一時変数を左辺値参照にバインドできるようになるためです。これにより、非標準準拠のコードが MSVC で機能するようになります。

だから答えるために

istringstreamこれはそのバグの拡張ですか、それともここで Rvalue を使用することは違法ですか?

いいえ、これはバグではありませんistream_iterator

于 2016-05-31T13:03:27.070 に答える