#include <iostream>
int func0(){
int a = 0;
return a;
}
int&& func1(){
int a = 0;
return a;
}
int main(){
int&& result0 = func0();
int&& result1 = func1();
}
return statement
правила:
- Функция возвращается к своему вызывающему оператору с помощью оператора return.
- [...] оператор return инициализирует объект результата glvalue или результат результата prvalue (явного или неявного) вызова функции путем инициализации копирования из операнда.
Правило инициализации объекта вызова функции - только # 2.
Мы знаем, что выражение func0()
является prvalue. Ссылка result0
должна связать объект, поэтому temporary materialization conversion
должна преобразовать значение prvalue в значение xvalue. Таким образом, временный объект как объект результата prvalue инициализируется из операнда return
, затем ссылка reusult0
привязывается к временный объект.
Но мы знаем, что result1
является ссылкой, а тип возвращаемого значения func1
также является ссылкой. Для этого случая [stmt.return] явно не охватывает этот случай, потому что result1
является ссылкой, а не object
(ни объект glvalue reuslt, ни объект результата prvalue), так что правила о этот случай? Если я что-то упустил, поправьте меня.