Ошибка компилятора GCC при извлечении символа из временного потока - PullRequest
9 голосов
/ 25 января 2012

Я пытаюсь прочитать один символ из потока.С помощью следующего кода я получаю ошибку компилятора «неоднозначная перегрузка» (GCC 4.3.2, и 4.3.4 ).Что я делаю не так?

#include <iostream>
#include <sstream>

int main()
{
    char c;
    std::istringstream("a") >> c;
    return 0;
}

Замечания:

  • Visual Studio 2008 компилируется без ошибок
  • Другие типы (int, double)работают
  • Если я сначала создаю переменную std::istringstream iss("a"); iss >> c, компилятор не выдает ошибку

Ответы [ 2 ]

9 голосов
/ 25 января 2012

Оператор извлечения >> для символов является шаблоном функции, не являющейся членом:

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 ссылкой.

4 голосов
/ 25 января 2012

Подпись для operator>>, считывающего char, равна

template<class charT, class traits>
basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>& in,charT& c);

В соответствии с правилами языка временное не может быть связано с первым параметром, так как временное не может быть связано с неконстантной ссылкой.

Visual Studio 2008 допускает это как расширение MS.Более поздние версии предупредят вас, что это не разрешено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...