Я прочитал этот вопрос и знаю, что rvalue referenec является lvalue.
Однако для этого кода, пример 1,
int &&fun() {
return 1;
}
int main() {
int &a = fun();
}
Когда яскомпилируйте его:
error: invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int'
Таким образом, компилятор C ++ сообщает мне, что тип возвращаемого значения fun
является rvalue.
Как ссылка на rvalue становится rvalue?
Я думаю, что компилятор должен обрабатывать ссылку на lvalue и ссылку на rvalue одинаково, но этот код, пример 2,
int & fun(){
int b;
return b;
}
int main(){
int & a=fun();
}
может быть скомпилирован (тем не менее, я получаю предупреждение).
Я думаю, что, возможно, тип возвращаемого значения fun
изменился в какой-то момент.
Попытка скомпилировать пример 3:
int &&fun() {
return 1;
}
int main() {
decltype(fun()) b = 1;
}
он успешно компилируется.Поэтому я могу сказать, что тип возвращаемого значения fun
действительно является ссылкой на rvalue.
Итак, почему ссылка на rvalue становится значением rvalue?
Вот пример 4:
int &&a = 1;
int &b = a;
Он компилирует и сообщает нам, что rvalue-ссылка может быть связана с lvalue-ссылкой.
Теперь, как насчет этих двух вопросов:
- В примере 1 это
fun()
rvalue? - В примере 1
fun()
является ли rvalue ссылкой?
Пример 3 говорит нам, что fun()
является ссылкой rvalue, а пример 4 сообщает нам rvalueссылка может быть привязана к ссылке lvalue (как const, так и не const).Тогда почему fun()
из примера 1 не может быть привязано к ссылке lvalue?
Пример 4 также указывает, что ссылка rvalue является lvalue, но ошибка компиляции в примере 1 говорит нам, что fun()
там, который в качестве примера является ссылкой на rvalue в примере 3, является rvalue.Итак, является ли rvalue ссылкой на lvalue или rvalue?
Если причина в том, что fun()
является просто выражением, которое существует временно и сразу исчезнет, почему fun()
из примера 2 не может рассматриваться какRvalue в то время как это также просто выражение без имени?Какая разница между выражением функции, возвращающей ссылку lvalue и ссылку rvalue?