Почему привязка ссылки на rvalue к xvalue не работает в моем коде?

Я пытался понять lvalue и rvalue в C ++ 11. Итак, я написал тестовый код:

int x = 10;
int foo() { return x; }
int& bar() { return x; }
int&& baz() { return 10; }

int main() {
int& lr1 = 10;     // error: lvalue references rvalue
int& lr2 = x;      // ok
int& lr3 = foo();  // error: lvalue references rvalue
int& lr4 = bar();  // ok
int& lr5 = baz();  // error: lvalue references rvalue

int&& rr1 = 10;    // ok
int&& rr2 = x;     // error: rvalue references lvalue
int&& rr3 = foo(); // ok
int&& rr4 = bar(); // error: rvalue references lvalue
int&& rr5 = baz(); // ok
}

Это работает довольно хорошо, поэтому я вставил std :: cout для печати результатов.

#include <iostream>

int x= 10;
int foo() { return x; }
int& bar() { return x; }
int&& baz() { return 10; }

int main() {
int& lr1 = 10;     std::cout << lr1 << std::endl; // error
int& lr2 = x;      std::cout << lr2 << std::endl; // ok
int& lr3 = foo();  std::cout << lr3 << std::endl; // error
int& lr4 = bar();  std::cout << lr4 << std::endl; // ok
int& lr5 = baz();  std::cout << lr5 << std::endl; // error

int&& rr1 = 10;    std::cout << rr1 << std::endl; // ok
int&& rr2 = x;     std::cout << rr2 << std::endl; // error
int&& rr3 = foo(); std::cout << rr3 << std::endl; // ok
int&& rr4 = bar(); std::cout << rr4 << std::endl; // error
int&& rr5 = baz(); std::cout << rr5 << std::endl; // ERROR!?
}

int&& rr5 = baz(); std::cout << rr5; вызывает ошибку времени выполнения, но я не знаю, почему это делает ошибку.

Я думаю, что возвращаемое значение baz() будет xvalue, поэтому его время жизни продлено. Но когда я пытался получить доступ к его значению, возникает ошибка. Зачем?

13

Решение

Я думаю, что возвращаемое значение baz() будет xvalue, поэтому его время жизни продлено.

Сначала что baz() Возвращение — это всегда свисающая ссылка.

За int&& baz() { return 10; }, время жизни временного не продлен. Он построен внутри функции и будет разрушен при выходе из функции, затем baz() всегда возвращает висячую ссылку.

временная привязка к возвращаемому значению функции в return Оператор не расширен: он уничтожается сразу в конце выражения возврата. Такая функция всегда возвращает висячую ссылку.

Тогда для int&& rr5 = baz();, rr5 это тоже свисающая ссылка; уважение к нему приводит к UB и все возможно.

С другой стороны, если вы измените baz() для возврата по значению все будет хорошо; возвращаемое значение копируется и затем связывается с rr5, тогда время жизни временного увеличивается до времени жизни rr5,

ЖИТЬ

18

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]