Неверное преобразование в неконстантную ссылку в C ++ 0x ... ошибка в std :: pair? - PullRequest
2 голосов
/ 01 февраля 2011

Я разрабатывал библиотеку, которая становится довольно большой, и теперь я добавляю некоторые основанные на шаблонах части, которые используют функции C ++ 0x.Поэтому я попытался скомпилировать свою библиотеку (которая была скомпилирована полностью без предупреждений по текущему стандарту) с флагом -std=c++0x с использованием gcc версии 4.4.5 (для Linux).Теперь я получил огромное количество сообщений об ошибках, связанных с преобразованием временных переменных в неконстантные ссылки.Проблема в том, что они не являются временными!

Вот небольшой фрагмент кода, который воспроизводит ошибку:

#include <iostream>
#include <map>

struct scanner {
  scanner& operator &(std::pair<std::string, int&> i) {
    std::cout << "Enter value for " << i.first << ": ";
    std::cin >> i.second;
    return *this;
  };
};

struct vect {
  int q[3];

  void fill(scanner& aScan) {
    aScan & std::pair<std::string, int&>("q0",q[0]) 
          & std::pair<std::string, int&>("q1",q[1]) 
          & std::pair<std::string, int&>("q2",q[2]); 
  };
};

int main() {
  vect v;
  scanner s;
  v.fill(s);
  return 0;
};

Если вы скомпилируете это с текущим стандартом (без c ++ 0xфлаг) он будет скомпилирован и запущен, как и ожидалось.Однако, если вы скомпилируете его с помощью -std=c++0x, он выдаст следующую ошибку во время компиляции:

/usr/include/c++/4.4/bits/stl_pair.h:94: error: invalid initialization of non-const reference of type ‘int&’ from a temporary of type ‘int’

Я действительно не могу понять это.Я просмотрел сеть и ТАК, но, похоже, ни у кого нет этой проблемы.Это ошибка в std :: pair?Мне бы очень хотелось знать, в чем проблема ... спасибо за понимание, которое вы можете дать.

PS: не жалуйтесь на "качество" или "глупость" приведенного выше кода, это не такреальный код .. просто пример, который показывает ошибку.

Ответы [ 4 ]

4 голосов
/ 01 февраля 2011

Ваш код недействителен C ++ 03, comeau дает (после добавления оператора возврата в op &):

"stl_pair.h", line 44: error: qualifiers dropped in binding reference of
          type "int &" to initializer of type "const int"
    pair(const _T1& __a, const _T2& __b) : first(__a), second(__b) {}
                                                              ^
          detected during instantiation of "std::pair<_T1, _T2>::pair(const
                    _T1 &, const _T2 &) [with _T1=std::string, _T2=int &]" at
                    line 17 of "ComeauTest.c"
...

Проблема в ссылке внутри пары. Если я правильно помню, это расширение GCC, которое позволяет это. Gcc принимает его с -std = gnu ++ 98, который является значением по умолчанию для C ++, но с -std = c ++ 98, gcc 4.4.3 дает:

In file included from /usr/include/c++/4.4/bits/stl_algobase.h:66,
                 from /usr/include/c++/4.4/algorithm:61,
                 from PREAMBLE:7:
/usr/include/c++/4.4/bits/stl_pair.h: In instantiation of ‘std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int&>’:
<input>:5:   instantiated from here
/usr/include/c++/4.4/bits/stl_pair.h:83: error: forming reference to reference type ‘int&’
...
3 голосов
/ 01 февраля 2011

Существует множество ошибок в поддержке gcc C ++ 0x, она очень незавершена, и разработка продолжается.Это вдвойне верно для такой старой версии, как gcc-4.4.5.Если вы серьезно настроены начать разработку C ++ 0x до ратификации стандарта, вам нужно использовать новейшую версию компилятора и стандартной библиотеки.

3 голосов
/ 01 февраля 2011

Он прекрасно компилируется как с -std=c++0x, так и без него с GCC 4.5.2.

Я думаю, что GCC 4.4.5 не поддерживает C ++ 0x настолько, чтобы это работало.

2 голосов
/ 01 февраля 2011

За исключением пропущенных return *this; в scanner& operator &(std::pair<std::string, int&> i), ваш код действителен C ++ 0x.

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