Подтвердить что ты не робот

Указывает ли ссылочная декларация новое имя для референта?

В этом вопросе мы узнали, что RVO нельзя применять к выражению типа p.first.

В комментариях также было высказано предположение, что RVO обычно не применяется к выражению типа r после объявления типа auto& r = p.first. Менее ясно, соответствует ли стандарт этому поведению.

в операторе return в функции с типом возвращаемого класса, когда выражение представляет собой имя энергонезависимого автоматического объекта (кроме параметра функции или переменной, введенной исключающим - объявление обработчика ([except.handle])) с тем же типом (игнорируя cv-qualification) в качестве возвращаемого типа функции, операцию копирования/перемещения можно опустить, построив автоматический объект непосредственно в возвращаемое значение функции

В следующем коде указано r имя объекта, также известного как o, до тех пор, пока RVO допустимо, если оно выражает выражение в выражении return?

int o = 42;
int& r = o;
4b9b3361

Ответ 1

CWG # 633 рассмотрел тот факт, что ссылки, в отличие от объектов, не имели фактических имен. Он был разрешен N2993, который расширил понятие переменной, чтобы охватить ссылки, тем самым давая им имена.
Теперь [основные]/6 читает (все внимание на меня):

Переменная вводится путем объявления ссылки, отличной от нестатического элемента данных или объекта. Имя переменной обозначает объект или ссылку.

Имя ссылки означает, что переменная - ссылка - не объект, на который ссылается ссылка. Хотя ссылки обычно объясняются как "другие имена объектов/функций", в стандартных терминах это определение является простым.

т.е. копирование в вашем примере неприменимо.


Поскольку вышеупомянутый документ не был принят до 2009 года, и вы отметили : документ можно рассматривать как ретроспективную коррекцию С++ 03. Однако в С++ 03, строго говоря, ссылка не является сущностью (это было исправлено CWG # 485), и поэтому идентификатор в его декларации никогда не обрабатывается как имя (см. [basic]/4, имя должно обозначать ярлык или сущность) - поэтому копирование elision не применяется снова.