Итак, если я установлю его равным i, разве я не говорю, что j является ссылкой на i
Это то, что вы пытаетесь сказать. Но тип i несовместим, так что это нельзя сказать.
, и мы не можем изменять int, на который указывает i, через j?
Если у вас был указатель на const, вы не могли бы изменить указанный int. И вы можете ссылаться на такой указатель с помощью j
. Но вы не создали такой указатель.
Однако указатель на неконстантный может быть преобразован в указатель на константный. Но результатом такого преобразования является значение, поэтому ваша ссылка на non-const не может быть привязана к нему. Если вы использовали ссылку на const, это продлило бы время жизни временного результата неявного преобразования:
const int * const &j = i;
Но ссылка просто добавляет ненужное слияние. Лучше дать преобразованному указателю имя, а не ссылаться на временный объект:
const int* j = i;
Почему тип i несовместим?
Потому что правила языка говорят так.
Это только правило?
Это правило (из последней версии стандарта):
Для заданных типов «cv1 T1» и «cv2 T2» «cv1 T1» связан со ссылкой на «cv2 T2», если T1 похож ([conv.qual]) на T2, или T1 является базовым классом T2. «Cv1 T1» совместим со ссылками с «cv2 T2», если значение типа «указатель на cv2 T2» можно преобразовать в тип «указатель на cv1 T1» через стандартную последовательность преобразования ([conv]). Во всех случаях, когда эталонно-совместимые отношения двух типов используются для установления sh достоверности эталонной привязки и стандартной последовательности преобразования, будут неверно сформированы, программа, которая требует такой привязки, неверно сформирована.
Ссылка на тип «cv1 T1» инициализируется выражением типа «cv2 T2» следующим образом:
затем ссылка привязывается к выражению инициализатора lvalue в первом случае и к результату lvalue преобразования во втором случае (или, в любом случае, к соответствующему подобъекту базового класса объекта).
- В противном случае, если ссылка является lvalue-ссылкой на тип, который не является константным или нестабильным, программа является некорректной.