Происходит ли преобразование Lvalue в Rvalue при вызове функции? - PullRequest
1 голос
/ 03 апреля 2020

Рассмотрим приведенный ниже код:

#include <iostream>
int func(){
   int a = 0;
   return a;
}
int main(){
   int result = func();
}

В соответствии со стандартом cpp некоторые правила для оператора return:

  1. Функция возвращается к своему вызывающий оператор return.
  2. [...] оператор return инициализирует результат glvalue или объект результата prvalue (явного или неявного) вызова функции путем copy-initialization из операнда

Итак, вызов для int result = func();, как если бы он мог быть переведен в:

//a fiction code
func(){
   int a = 0;
   int result = a; #1
}

Поскольку a является glvalue, его следует преобразовать prvalue для оценки prvalue (инициализация объекта). Таким образом, мой вопрос заключается в том, что при вызове int result = func(); в теле func необходимо ли преобразовать glvalue a, который в качестве операнда return необходимо преобразовать в prvalue?

1 Ответ

1 голос
/ 03 апреля 2020

Да a подвергается преобразованию lvalue в rvalue как часть инициализации объекта результата. (Неофициально это означает, что извлекается значение, хранящееся в ячейке памяти с именем a).

См. [Dcl.init] /17.8:

В противном случае, начальное значение инициализируемый объект - это (возможно, преобразованное) значение выражения инициализатора. Стандартные преобразования (раздел 7) будут использоваться при необходимости для преобразования выражения инициализатора в неквалифицированную по cv версию целевого типа; пользовательские преобразования не рассматриваются.

Раздел 7 включает преобразование lvalue в rvalue.

...