Передача ссылочного аргумента и возврат ссылки - PullRequest
0 голосов
/ 20 апреля 2019

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

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

например. Являются ли оба значения действительными?*

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

1 Ответ

1 голос
/ 20 апреля 2019

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

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

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

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

Задача 1

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

Задача 2

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

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

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

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


Палка с

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

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

...