Функции оператора Вызывающий механизм - PullRequest
0 голосов
/ 02 апреля 2020

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

#include <stdio.h>
class OUT
{};

OUT & operator<<(OUT & out, int x)
{
printf("%d",x);
return out;
}    

int main()
{
OUT print;
print<<3<<4;   
}

1 Ответ

2 голосов
/ 02 апреля 2020

Да, использование перегруженной операторной функции - это семантически вызов функции.

[over.match.oper] / 2 в стандарте C ++ говорит, выделение мое:

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

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

Ваш пример хорош не потому, что в операторских функциях есть что-то особенное, а потому, что он не возвращает ссылка на локальный объект. В return out;, out называет параметр функции ссылочным типом, поэтому он ссылается на некоторый другой объект вне области действия функции. В этом случае out относится к переменной print в main, а время жизни print заканчивается до main.

...