Как выглядит стек вызовов, когда вы инициализируете ссылку из функции, возвращаемой значением в C ++? - PullRequest
0 голосов
/ 26 ноября 2018

Как выглядит стек вызовов, когда вы инициализируете ссылку возвращаемым значением функции?

int i = 0;
int &j = i;

Я понимаю, что j и i оба указывают на одну и ту же ячейку памяти.

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

int f();
const int &j = f();

В каком кадре стека находится ячейка памяти, на которую ссылается j?Почему это должно быть const?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

В языке нет понятия «стековый фрейм».В случае

const int &j = f();

ссылка прикрепляется к временному объекту, возвращенному f().«Никто не знает», где находится этот временный объект.Язык не определяет это.Однако, поскольку его время жизни увеличено, чтобы соответствовать тому из ссылки, вероятно, можно с уверенностью предположить, что типичные реализации будут выделять это временное в стеке * вызывающего абонента.

Что касается того, почему ссылка имеетбыть const ... Это так, потому что правила языка требуют этого.Вы не можете присоединять неконстантные lvalue-ссылки к rvalues ​​в C ++.

0 голосов
/ 26 ноября 2018

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

j в первом случае это другое имя для i.

Во втором случае, предполагая [c ++ 17], повторно вызывая prvalue(например, int), который не используется для инициализации значения, приводит к временной материализации.Если этот временный объект напрямую связан со ссылкой (в большинстве случаев), срок действия временного объекта увеличивается до срока действия ссылки.

Временные ссылки могут связываться с lvalue ссылками на const (то есть int const&) или rvalue.ссылки (т.е. int&&).

...