2013-12-15 5 views
2

Если я правильно понимаю, мотивация ссылок заключалась в том, чтобы упростить и очистить работу «по ссылке», не беспокоясь о разыменовании указателя. Но они носят постоянный характер, они могут указывать только на один объект, даже если эффективно ссылка является указателем, и переориентация технически возможна. Было бы также полезно, если ссылка может быть нулевой, например. проверьте, действительно ли возвращаемая ссылка действительна до ее использования, но это не является функцией.Почему не может быть переназначен целевой объект ссылки?

Что может быть особой мотивацией для отказа от таких функций и представления функции как есть?

+0

Что касается «Было бы также полезно, если ссылка может быть нулевой, например, проверить, действительно ли возвращаемая ссылка действительна до ее использования»: как бы поддержка нулевой ссылки была поддержана с помощью проверки правильности? Действителен нулевой указатель. Недопустимый указатель висячего не является нулевым и не может быть проверен. Я бы подумал, что это так же со ссылками, да? –

+0

Еще лучше, потому что ссылка не может быть «нулевой», вам даже не нужно ничего проверять! –

+0

@KerrekSB - как вам лучше не проверять, завершилась ли операция, а возврат недействителен? Если объект уже находится в регистре, проверка займет один цикл, а небольшая цена - для лучшей безопасности. Учитывая, что ссылка - это не что иное, как указатель с отключенной арифметикой и автоматическим разыменованием, почему бы не отразить способность указателя быть нулевым и, следовательно, означать недействительность? Были введены ссылки, чтобы «проще и чище» использовать указатели, не так ли? –

ответ

3
  1. Если вы хотите ссылаться на несколько объектов, вам просто нужен другой ТИП ссылки.
  2. Если вы хотите, чтобы иметь возможность изменять саму ссылку (а не только то, на что она ссылается), вам нужен указатель. То же самое для ссылки, которая может не ссылаться ни на что (т. Е. Быть нулевым).

Итак, это мотивация: сосредоточьтесь на том, чего еще нельзя сделать с помощью других средств.

0

Ссылки, являющиеся недействительными, являются хорошей вещью, это позволяет вам делать более надежные гарантии о том, что входные функции и так далее. Он позволяет передавать объекты без необходимости выполнять нулевой указатель.

Если вы хотите, чтобы измененная ссылка использовала указатель или std::reference_wrapper. Если вам требуется дополнительное возвращаемое значение, вы можете использовать что-то вроде boost::optional.

+0

Более сильные гарантии? Висячие ссылки так же легко производить. Во всяком случае, ссылочная ссылка может быть чрезвычайно полезна для проверки правильности ссылки, и проверка займет всего один такт. –

5

Есть две части к мотивации:

1) Ссылка концептуально псевдоним для объекта, так что он ведет себя (насколько это возможно и полезно) как имя переменной. До тех пор, пока он находится в области видимости, он относится к одному и тому же объекту и всегда ссылается на объект. Таким образом, он не может быть заменен на сиденье и не равен нулю.

2) Ссылки были изобретены с целью передачи параметров перегруженным операторам. Нет особой необходимости переустанавливать такие параметры, и они обязательно должны всегда ссылаться на объект, потому что оператор всегда имеет операнды (или только один операнд для унарных операторов). Функция, которая подходит для этой цели, была псевдонимом для операнда, поэтому ссылки были задуманы как псевдонимы.

Будучи задуманным таким образом, у них есть другие виды использования. Ни одно из этих применений не принесло бы пользы от того, что они были повторно посажены или были пустыми, чтобы сделать случай изменения концепции от имени объекта. Ближайший, вероятно, используется как нестатические члены данных в классах. В этом случае они вмешиваются в такие вещи, как копирование, но опять же неясно, как элемент справочных данных должен «вести себя» при назначении копии, поэтому нет четкого способа справиться с этим. Указатели будут иметь дело с случаями, которые ссылки не могут.

+0

«До тех пор, пока оно находится в области видимости, оно относится к одному и тому же объекту». Я вижу конфликт с реальностью здесь, ссылки могут быть возвращены из функций, а CONTINUE, указывающие на их объект после того, как выполнение оставило область исходного объекта. Ссылки на C++ были добавлены в C++, чтобы упростить и безопаснее передавать по ссылке без использования указателей, так почему бы не отразить способность указателя быть «нулевым», чтобы показать, не сработала ли какая-либо операция? Какие отрицательные последствия могут иметь такие, если таковые имеются? –

0

Я бы сказал, что ограничения на то, что можно сделать с помощью ссылок есть, потому что она позволяет:

  • компилятор делать строгую проверку на действительное использование ссылок, что дает безопасность во время компиляции при использовании ссылки в большинстве ситуации более
  • сложные операции все еще могут быть сделаны с помощью регулярных указателей

Так указателей для ситуаций, когда вы знаете вы хотите сделать хитрый материал с ними.Ссылки для типичного случая «Я просто хочу передать часть данных вокруг», не беспокоясь о том, чтобы делать это правильно.

 Смежные вопросы

  • Нет связанных вопросов^_^