Ссылки - это не просто указатели с более коротким синтаксисом.Это другое имя для фактического объекта, к которому они относятся, даже когда они используются в качестве lhs присвоения.
int i = 3;
int j = 4;
int &ref = i;
ref = j;
std::cout << i << "\n"; // prints 4: i itself has been modified,
// because semantically ref *is* i
То есть ref = j
имеет тот же эффект, что и i = j
, или такой жеэффект как *ptr = j
, если вы сначала сделали int *ptr = &i;
.Это означает «скопировать содержимое объекта j
в любой объект, на который ссылается ref
».
Для полного времени жизни ref
он всегда будет ссылаться на i
.Он не может быть использован для ссылки на любой другой тип int, то есть он не может быть «повторно установлен».
То же самое относится и к элементам ссылочных данных, просто их время жизни отличается от автоматических переменных.
Итак, когда вы пишете this.left = new_left
, что означает , что означает , «скопируйте содержимое объекта new_left
в любой объект, на который ссылается this.left
».Что (а) не то, что вы имеете в виду, так как вы надеялись пересаживать this.left
, и (б), даже если это было то, что вы имели в виду, это невозможно, поскольку this.left
имеет ссылочные элементы, которые сами не могут быть повторно установлены.
Это (b) вызывает ошибку компилятора, которую вы видите, хотя (a) именно поэтому вы должны использовать указатели для этого.