long long
необязательно имеет размер, равный long
, и может даже использовать совершенно другое внутреннее представление. Поэтому вы не можете привязать неконстантную ссылку к long
к объекту типа long long
или наоборот. Стандарт запрещает это, и ваш компилятор не допустит этого.
Вы можете удивиться тому же фрагменту кода:
long a = 0;
long long b = 0;
a = b; // works!
long *pa = 0;
long long *pb = pa;
Последняя инициализация не будет работать. То, что тип может быть преобразован в другой, не означает, что другой тип, который объединяет один из них, может быть преобразован в третий тип, который соединяет другой. Аналогично для следующего случая
struct A { long i; };
struct B { long long i; };
A a;
B b = a; // fail!
В этом случае A
и B
каждое составляет типы long
и long long
соответственно, так же, как long&
и long long&
составляют эти типы. Однако они не будут конвертируемыми друг в друга только из-за этого факта. Другие правила применяются.
Если ссылка на const, создается временный объект правильного типа, и ссылка затем привязывается к этому объекту.