Lvalue istringstream Требуется для istream_iterator?

Учитывая string foo в Visual Studio, я могу разбить слова на 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>&} из rvalue типа std::basic_istream<char>

Теперь я знаю, что в gcc была ошибка, которая была исправлена ​​нашими Джонатан Уэйкли. Является ли это продолжением этой ошибки или использование здесь Rvalue istringstream должно быть незаконным?


person Jonathan Mee    schedule 31.05.2016    source источник


Ответы (1)


Это не ошибка gcc, а злое расширение MSVC. Для std::istream_iterator::istream_iteraor() требуется ссылка lvalue. Поскольку istringstream(foo) является временным, gcc правильно говорит вам, что вы не можете привязать временное значение к ссылке lvalue.

Причина, по которой это работает в MSVC, заключается в ранее упомянутом расширении, которое позволяет привязывать временные объекты к ссылкам lvalue. Это позволяет коду, не соответствующему стандарту, работать на MSVC.

Итак, чтобы ответить

Является ли это продолжением этой ошибки или использование здесь Rvalue istringstream должно быть незаконным?

Нет, это не ошибка, и вам нужен не временный поток, чтобы построить istream_iterator.

person NathanOliver    schedule 31.05.2016