Как уже говорили другие, вы можете взять постоянную, но не неконстантную ссылку на временную.
На практике было бы опасно допускать неконстантные ссылки на временные ссылки:
#include <iostream>
void foo(int &i) {
i = 5;
}
int main() {
long l = 4;
foo(l);
std::cout << l << "\n";
}
Теперь l
может быть неявно преобразовано в int
, поэтому, если бы здесь была разрешена неконстантная ссылка на временную, то, вероятно, foo
будет передана ссылка на результат этого преобразования, так же, как на самом деле, если foo
занимает const int &
. Назначение будет сделано для временного и затем отброшено, когда временное уничтожено. Это гораздо более вероятная ошибка, чем предполагаемый результат.
Я не знаю, есть ли аккуратный набор правил, разрешающих неконстантные ссылки на временные ссылки в некоторых ситуациях, но не в опасных / раздражающих, но даже в этом случае стандарт C ++ не включал их. Обратите внимание, что в C ++ 0x есть ссылки на rvalue, которые позволяют вам делать некоторые дополнительные вещи с временными файлами, что невозможно сделать в C ++ 03.