Оператор извлечения >>
для символов является шаблоном функции, не являющейся членом:
template<class charT, class traits>
basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&);
Так как это принимает первый аргумент по ссылке не-1005 *, вы не можете использовать временное rvalue . Поэтому ваш код не может выбрать эту перегрузку, только перегрузки различных функций-членов, ни одна из которых не соответствует этому использованию.
Ваш код действителен в C ++ 11, потому что есть также оператор извлечения, принимающий ссылку rvalue в качестве первого аргумента.
Visual Studio 2008 компилируется без ошибок
Одно из многих нестандартных расширений этого компилятора - разрешить временные значения r быть привязанными к не const
ссылкам.
Другие типы (int
, double
) работают
Большинство операторов извлечения для основных типов являются функциями-членами, которые могут вызываться для временного rvalue .
Если я сначала создаю переменную std::istringstream iss("a"); iss >> c
, компилятор не выдает ошибку
iss
не является временным lvalue , поэтому его можно связать с не const
ссылкой.