Потому что, если бы это было разрешено, то это не выглядело бы хорошо и не было бы таким же интуитивно понятным, как и со ссылкой.
Предположим, что это разрешено, тогда вы бы написали:
struct A{};
A a, *pa, b;
a = pa ;//doesn't look good, also not intuitive. (not real C++)
Это не выглядит хорошо, потому что на левой стороне у вас нет указателя, на правой стороне у вас указатель.Выглядит очень и очень странно.Кроме того, так как типы не совпадают, это не выглядит интуитивно понятно, что именно он делает.Я имею в виду, вы назначаете указатель на не указатель;что такое назначение должно делать?Копирование содержимого адреса, на который указывает указатель на пункт назначения (не указатель), не очень интуитивно понятно.
С другой стороны, поскольку это допускается со ссылкой (реальность, а не предположение):
a = b; //looks good, intuitive, as now both side is same type
Со ссылкой у вас есть обе стороны одного типа, только когда b
передается operator=()
в качестве аргумента, он передается по ссылке (или, скажем, указателем , поскольку ссылки являются синтаксическим сахаром указателей.), чтобы избежать ненужного копирования, что, в свою очередь, не снижает производительность, как если бы было передано по значению ,
Было бы также интересно отметить, что не только b
передается ссылкой (или указателем внизу), a
также передается функциипо указателю , поскольку мы знаем, что в функции ключевое слово this
на самом деле является указателем .
Итак, ссылки были введены в C ++, чтобы все выглядело хорошо и интуитивно понятно для программистов, в противном случае они указатели внизу.Фактически, большинство компиляторов реализуют ссылки, используя указатели (механизм-указатель) внутри.