将lvaue传递给c++中的非常数引用

Passing lvaue to non const references in c++

本文关键字:非常 引用 c++ lvaue      更新时间:2023-10-16

我在加速c++中读到,我们应该将左值传递给非常量引用。为什么?据我所知,左值是可以修改的。请告诉我它是否有另一个定义。

我通过编写一个简单的程序来检查它:

#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值的非常量引用初始化无效

rvaluelvalue在这里有什么含义?dret()中的一个局部变量,它是通过值传递的,因此不存在悬空问题。

调用rec(ret())并请向我解释rec()是如何发送其自变量的。

你说,

据我所知左值是一个不能修改的值。

这是不对的。传统上,lvalue代表一个可以出现在赋值运算符左侧的值,这意味着它们必须是可修改的。

这一含义至今仍然有效。

也许您混淆了右值,它代表一个可以出现在赋值运算符右侧的值,该值可能是可修改的,也可能是不可修改的。

这一含义至今仍然有效。

编辑

现在你把问题改成:

据我所知左值是可以修改的。

答案对你来说应该是显而易见的。当函数的参数类型是非常数引用时,只有左值s可以传递给此类函数,而不是右值s。

编辑2

感谢@0x499602D2:的评论

对于用户定义的类,您可以在右值上使用赋值运算符,因为它们类似于成员函数调用:A{} = A{};将在给定可访问的复制/移动赋值运算符的情况下编译。我认为术语左值指定了一个将存在于所用表达式之外的对象,而右值