Дело не в том, что адрес не может быть получен (компилятор всегда может упорядочить его в стеке, что он делает с ref-to-const), это вопрос намерений программистов. С интерфейсом, который принимает A &, он говорит: «Я изменю то, что находится в этом параметре, чтобы вы могли читать после вызова функции». Если вы передадите его временно, то «модифицированного» объекта не будет после функции. Это (вероятно) ошибка программирования, поэтому она запрещена. Например, рассмотрим:
void plus_one(int & x) { ++x; }
int main() {
int x = 2;
float f = 10.0;
plus_one(x); plus_one(f);
cout << x << endl << f << endl;
}
Это не компилируется, но если временные файлы могут связываться с ref-to-non-const, это компилируется, но дает удивительные результаты. В plus_one (f) f будет неявно преобразован во временное int, plus_one будет брать temp и увеличивать его, оставляя базовый float нетронутым. Когда plus_one вернется, это не будет иметь никакого эффекта. Это почти наверняка не то, что задумал программист.
Правило иногда портит. Типичный пример (описанный здесь ) - попытка открыть файл, распечатать что-нибудь и закрыть его. Вы хотели бы иметь возможность:
ofstream("bar.t") << "flah";
Но вы не можете, потому что оператор << принимает ref-to-non-const. Вы можете разбить его на две строки или вызвать метод, возвращающий ref-to-non-const: </p>
ofstream("bar.t").flush() << "flah";