Передача ссылочного аргумента и возврат ссылки

#c #operator-overloading #pass-by-reference

#c #перегрузка оператора #передача по ссылке

Вопрос:

Я читал о перегрузке операторов и узнал, что если вы возвращаете ссылку из функции, вы можете каскадировать перегруженные операторы.

Мой вопрос заключается в следующем. Чтобы вернуть ссылку, вам нужно передать ссылку на функцию или подойдет значение?

например, оба допустимы?

 ostream amp;operator<<(ostream output, string amp;label);
  

и

 ostream amp;operator<<(ostream amp;output, string amp;label);
  

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

Комментарии:

1. Если вы передаете значение, компилятор отправляет копию. Затем вы возвращаете ссылку на копию, а затем строка заканчивается, и копия уничтожается … ваша ссылка висит.

2. Если вы намерены вернуть ссылку на что-то, что передается, это что-то должно быть передано в качестве ссылки. В случае operator<<() для потоковой передачи в ostream s, ostream должно быть передано по ссылке. Передача по значению означает, что возвращается ссылка на временный (аргумент), что вызывает неопределенное поведение.

Ответ №1:

Вы не можете использовать

 std::ostream amp;operator<<(std::ostream output, std::string amp;label);
  

поскольку std::ostream не имеет конструктора копирования.

Даже если std::ostream бы у вас был конструктор копирования, использование вышеупомянутого интерфейса вызвало бы следующие проблемы.

Проблема 1

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

Проблема 2

Это гипотетически.

Представьте, что произойдет, если вы используете:

 std::ofstream outfile("myoutput.txt");
outfile << "A string.";
  

Вызов приведет к разделению объекта. Вы потеряете целостность объекта. std::ofstream Куда будет отправлен вывод в этой функции? Это, конечно, не перейдет в файл.


Придерживайтесь

 std::ostream amp;operator<<(std::ostream amp;output, std::string constamp; label);
  

PS Да, я изменил тип второго аргумента на constamp; .

Комментарии:

1. И я понимаю, почему вы добавили ключевое слово const . Спасибо за это 🙂