Код, который вы публикуете, недопустим в C ++ 03 (то есть, каким был языковой стандарт C ++ до сентября 2011 года).В C ++ 03 есть только одна перегрузка operator>>
, которая может быть рассмотрена здесь [я удалил весь код шаблона, потому что он не релевантен]:
istream& operator>>(istream&, string&);
Обратите внимание, что *Параметр 1005 * является неконстантной ссылкой, поэтому временный объект std::istream
использовать нельзя.В вашем коде вы пытаетесь использовать временный объект там.
В C ++ 11 (т. Е. В текущем стандарте языка C ++) существует дополнительная перегрузка, которая принимает объект std::istream
по ссылке rvalue,Это позволяет либо передать временное значение через этот параметр.
Visual C ++ уже поддерживает эту функцию C ++ 11, поэтому, как указывает Бенджамин Линдли в комментарии, ваш код действительно скомпилируется, если выиспользуйте Visual C ++ 2010 или более позднюю версию.Ваша сборка Clang может поддерживать это, если вы используете флаг -std = c ++ 0x .