Как будет рассматриваться ссылка в этих случаях? - PullRequest
1 голос
/ 01 декабря 2010

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

//global scope

void someFunc(SomeType & ref){//when function is inline, it's possible for ref to be the referent itself
 //function body
}
int num=7;
int & ref=num;//what about ref here?
void someFunc1(){
 int num=6;
 int & ref=num;//what about ref here?
 //rest of function body
}
int & someFunc2(){//what about output reference here when function is inlined, will it be num itself or a pointer ?
 int num=8;
 return num;
}

Ответы [ 3 ]

1 голос
/ 01 декабря 2010

тогда ссылка будет референтом сам по себе и не обязательно указатель к этому

Семантически, ссылка - это всегда (имя) самого объекта, а никогда указатель на него.

С точки зрения реализации, нет гарантии, что если функция встроенная, то указатель не будет использоваться. Нет никаких гарантий относительно глобальных или локальных переменных. Ваш someFunc2() создает висячую ссылку с неопределенным поведением.

Во всех трех допустимых случаях (inline, global, local) вполне вероятно, что компиляторы будут избегать использования дополнительного пространства для хранения указателя, но если вы хотите сделать определенные операторы, вам нужно выбрать компилятор и изучить его внутренние компоненты. В случае глобала с внешней связью, очевидно, исполняемый формат должен разрешать это тоже.

1 голос
/ 01 декабря 2010

Дэвид Родригес - dribeas уже указывал в комментарии, что стандарт дает компиляторам немного широты, когда речь идет о ссылках. Они могут или не могут занимать место; они не являются собственными объектами и т. д.

Поведение, которое вы описываете для аргументов функции ссылочного типа (исключено во время встраивания), типично для свободы, которой обладают компиляторы, когда дело доходит до ссылок. Но это свобода, а не обязанность для них. Это также не всегда возможно: когда вы вызываете SomeFunc( a>5 ? foo : bar);, компилятор не может заменить ссылку самим референтом "."

Ваши другие примеры аналогично ничем не ограничены. Теоретически, глобальные и локальные ссылки могут быть оптимизированы, потому что ничто не остановит их. Последний пример может быть полностью встроен как exit(NasalDemons());, потому что вы возвращаете ссылку на объект, который вышел из области видимости.

1 голос
/ 01 декабря 2010

В первом случае, когда ссылка является глобальной, она будет указывать глобальный номер в конец исходного файла.Во втором случае, когда ref находится в someFunc1, он будет указывать num до конца someFunc1.Вы не должны делать так, как в последнем случае, потому что num будет уничтожен в конце someFunc2, поэтому у вас будет ошибка сегментации, если вы будете использовать ее снаружи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...