返回const lvalue引用rvalue临时?为什么这项工作
Returning const lvalue reference to rvalue temporary? Why does this work?
为什么此代码工作?它每次都打印出60
。首先,const thingy&
表示该函数返回对已经存在的变量,而不是无名结构的引用。其次,当功能返回时,那个临时的死亡是否应该不应该创建null引用吗?我正在使用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;
}
您的两个选项都不是按C 标准工作的所需的,因此不应假定在任何特定情况下都一定会起作用。
编译器的细节已导致第一个选项在您直接返回值的地方工作。
理想情况下,您将按值(thingy getThingy();
)返回以确保兼容性。任何值得您时间的编译器仍将对此应用回报值优化,从而阻止了复制构造函数调用的需求并仍允许必要的效率。
编译器在此处执行返回值优化。
https://en.wikipedia.org/wiki/return_value_optimization
编译器能够在申报表中构建的值,甚至不需要复制它。但是,在您在函数内部构造结构的示例中,它确实是局部变量,因此在函数结束时掉落了范围,使参考文献无效。
我们不应混合rvalue和lvalue参考。最好的选择是通过复制返回。
返回局部变量的薰衣草恢复将始终导致问题。
相关文章:
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 为什么我的 std::ref 无法按预期工作?
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 有人能解释一下为什么下界是这样工作的吗C++的
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 为什么stream::忽略未按预期工作
- 为什么 HeapFree() 不能正常工作?
- 为什么我在 AVR 中的中断无法正常工作?
- 为什么指针在对二维数组进行排序时无法正常工作?
- 为什么C++需要公共继承,忽略朋友声明,才能使动态向下工作?
- 为什么 sizeof(ar)/ sizeof(ar[0]) 在传递给函数时无法在向量上正常工作?
- 为什么它在不分配内存的情况下工作正常
- 为什么重载运算符"="动态数组的类上无法正常工作?C++
- std::async 如何工作:为什么它会调用这么多次复制/移动?
- 为什么"std::is_function_v"不能按预期工作?
- if-else 语句仅按特定顺序工作,我不知道为什么
- 为什么我的 while 循环对于特定输入中断,而对于其他输入工作正常?
- 你能向我解释这段代码吗,为什么工作是 c++ 质数
- C++函数指针.它是如何工作的以及为什么工作
- Boost::Bind和虚函数重载:它们为什么工作?