我在加速c ++中读到我们应该将lvalue传递给非const引用。这是为什么?据我所知,左值是可以修改的值。请告诉我它是否有另一个定义。
我通过编写一个简单的程序来检查它:
#include<iostream>
#include<vector>
using namespace std;
vector<double> ret()
{
vector<double> d;
return d;
}
void rec(vector<double> &g)
{
cout<<"entered..."<<endl;
}
int main
{
rec(ret());
}
错误是
从r值
初始化非const引用无效
rvalue
和lvalue
有什么意义? d
是ret()
中的局部变量,它按值传递,因此不存在悬空问题。
调用rec(ret())
时会发生什么
向我解释rec()
如何发送其论点。
答案 0 :(得分:1)
你说,
据我所知左值是无法修改的值。
这是不正确的。传统上,左值代表一个值,它可以出现在赋值运算符的左侧,这意味着它们必须是可修改的。
这个意思今天仍然有效。
也许你会对 rvalue 感到困惑,它代表了一个可以出现在赋值运算符右边的值,它可能是可修改的,也可能是不可修改的。
这个意思今天仍然有效。
修改强>
现在您已将问题更改为:
据我所知左值是可以修改的值。
答案应该是显而易见的。当函数的参数类型是非const引用时,只有 lvalue 可以传递给这些函数,而不是 rvalue 。
编辑2
感谢@ 0x499602D2的评论:
对于用户定义的类,您可以在 rvalue 上使用赋值运算符,因为它们就像成员函数调用一样:
A{} = A{};
将在给定可访问的复制/移动赋值运算符的情况下编译。我认为术语 lvalue 指定的对象将存在于使用它的表达式之外, rvalue 意味着相反。