首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么rvalue引用绑定到xvalue在我的代码中无效?

为什么rvalue引用绑定到xvalue在我的代码中无效?
EN

Stack Overflow用户
提问于 2017-07-11 09:48:23
回答 1查看 1.1K关注 0票数 14

我试图理解C++11中的lvalue和rvalue,所以我编写了一个测试代码:

代码语言:javascript
复制
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来打印结果。

代码语言:javascript
复制
#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,因此它的生存期延长了。但是当我试图访问它的值时,就会发生错误。为什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-11 09:54:44

我认为baz()的返回值是xvalue,因此它的生存期延长了。

首先,baz()返回的内容总是一个悬空的引用。

对于int&& baz() { return 10; }临时寿命是不扩展的。它是在函数内部构造的,当退出函数时,它将被销毁,然后baz()总是返回一个悬空引用。

不扩展绑定到return语句中函数的返回值的临时值:它将在返回表达式的末尾立即销毁。这样的函数总是返回一个悬空引用。

那么对于int&& rr5 = baz();来说,rr5也是一个悬空的引用;对它的尊重会导致UB,任何事情都是可能的。

另一方面,如果您将baz()更改为按值返回,则一切都会正常;返回值将被复制,然后绑定到rr5,然后将临时值的生存期扩展到rr5的生存期。

活着

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45031045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档