Я разрабатывал библиотеку, которая становится довольно большой, и теперь я добавляю некоторые основанные на шаблонах части, которые используют функции 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: не жалуйтесь на "качество" или "глупость" приведенного выше кода, это не такреальный код .. просто пример, который показывает ошибку.