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

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

Я попытался понять lvalue и rvalue в С++ 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; вызывает Runtime Error, но я не знаю, почему он делает ошибку.

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

4b9b3361

Ответ 1

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

Во-первых, то, что возвращает baz(), всегда является зависающей ссылкой.

Для int&& baz() { return 10; } время UB, и все возможно.

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

LIVE