返回const左值引用到右值临时?为什么这样做?

真菌叔叔

为什么此代码有效?60每次打印一次。首先,const thingy&表明函数返回对已经存在的变量的引用,而不是无名的构造。其次,当函数返回并创建空引用时,该临时对象是否不应该死亡?我正在使用OSX上最新的GCC版本...有人可以向我解释为什么这行得通吗?

#include <iostream>

using namespace std;

struct thingy {
    double things;
    double moreThings;
    double evenMoreThings;
};

const thingy& getThingy() {
    return {60, 60, 60};
}

int main() {
    cout << getThingy().evenMoreThings << endl;
}

如果可行,那为什么不呢?

const thingy& getThingy() {
    thingy t{60, 60, 60};
    return t;
}
迈克尔·S

编译器在此处执行返回值优化。

https://zh.wikipedia.org/wiki/返回值优化

编译器能够采用返回值构造的值,甚至不需要复制它。但是,在您在函数内部构造struct的示例中,它实际上是一个局部变量,因此在函数末尾超出范围,从而使引用无效。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么重载的移动赋值运算符返回左值引用而不是右值引用?

来自分类Dev

右值引用到左值引用-UB?

来自分类Dev

为什么此函数在给定右值参数的情况下返回左值引用?

来自分类Dev

为什么右值引用作为左值引用传递?

来自分类Dev

为什么标准允许左值引用元组分配右值引用元组?

来自分类Dev

由于字符串文字被视为左值,为什么绑定左值引用必须是const?

来自分类Dev

从左值引用到右值引用的C ++转换unique_ptr

来自分类Dev

为什么std :: move复制右值或const左值函数参数的内容?

来自分类Dev

为什么可以将右值间接绑定到左值引用,而不能直接绑定呢?

来自分类Dev

为什么C ++左值对象不能绑定到右值引用(&&)?

来自分类Dev

为什么将表达式强制转换为右值,对函数的引用是左值?

来自分类Dev

为什么不能使用右值来初始化左值引用?

来自分类Dev

返回语句将右值引用绑定到左值?

来自分类Dev

C ++引用返回左值还是右值?

来自分类Dev

为什么const限定词允许临时对象或右值?

来自分类Dev

为什么const限定词允许临时对象或右值?

来自分类Dev

通过左值引用修改右值的行为是什么?

来自分类Dev

为什么右值引用整数合法

来自分类Dev

CSS:左/右/中心示例,请解释为什么这样做

来自分类Dev

返回右值引用

来自分类Dev

将临时右值绑定到std :: vector构造函数中的引用左值

来自分类Dev

C ++使用临时对象右值初始化左值引用以及自动推导

来自分类Dev

为什么添加const将通用引用作为右值

来自分类Dev

为什么我可以在C ++中使用for循环将右值绑定到非const引用?

来自分类Dev

左值到右值引用绑定

来自分类Dev

左值到右值引用绑定

来自分类Dev

将返回类型专门用于void或const左值引用

来自分类Dev

对指针错误的引用:非常量左值引用“ const * FooBarClass”无法绑定到临时对象

来自分类Dev

为什么我可以为右值引用分配值?

Related 相关文章

  1. 1

    为什么重载的移动赋值运算符返回左值引用而不是右值引用?

  2. 2

    右值引用到左值引用-UB?

  3. 3

    为什么此函数在给定右值参数的情况下返回左值引用?

  4. 4

    为什么右值引用作为左值引用传递?

  5. 5

    为什么标准允许左值引用元组分配右值引用元组?

  6. 6

    由于字符串文字被视为左值,为什么绑定左值引用必须是const?

  7. 7

    从左值引用到右值引用的C ++转换unique_ptr

  8. 8

    为什么std :: move复制右值或const左值函数参数的内容?

  9. 9

    为什么可以将右值间接绑定到左值引用,而不能直接绑定呢?

  10. 10

    为什么C ++左值对象不能绑定到右值引用(&&)?

  11. 11

    为什么将表达式强制转换为右值,对函数的引用是左值?

  12. 12

    为什么不能使用右值来初始化左值引用?

  13. 13

    返回语句将右值引用绑定到左值?

  14. 14

    C ++引用返回左值还是右值?

  15. 15

    为什么const限定词允许临时对象或右值?

  16. 16

    为什么const限定词允许临时对象或右值?

  17. 17

    通过左值引用修改右值的行为是什么?

  18. 18

    为什么右值引用整数合法

  19. 19

    CSS:左/右/中心示例,请解释为什么这样做

  20. 20

    返回右值引用

  21. 21

    将临时右值绑定到std :: vector构造函数中的引用左值

  22. 22

    C ++使用临时对象右值初始化左值引用以及自动推导

  23. 23

    为什么添加const将通用引用作为右值

  24. 24

    为什么我可以在C ++中使用for循环将右值绑定到非const引用?

  25. 25

    左值到右值引用绑定

  26. 26

    左值到右值引用绑定

  27. 27

    将返回类型专门用于void或const左值引用

  28. 28

    对指针错误的引用:非常量左值引用“ const * FooBarClass”无法绑定到临时对象

  29. 29

    为什么我可以为右值引用分配值?

热门标签

归档