将lvaue传递给c++中的非常数引用
Passing lvaue to non const references in c++
我在加速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值的非常量引用初始化无效
rvalue
和lvalue
在这里有什么含义?d
是ret()
中的一个局部变量,它是通过值传递的,因此不存在悬空问题。
调用rec(ret())
并请向我解释rec()
是如何发送其自变量的。
你说,
据我所知左值是一个不能修改的值。
这是不对的。传统上,lvalue代表一个可以出现在赋值运算符左侧的值,这意味着它们必须是可修改的。
这一含义至今仍然有效。
也许您混淆了右值,它代表一个可以出现在赋值运算符右侧的值,该值可能是可修改的,也可能是不可修改的。
这一含义至今仍然有效。
编辑
现在你把问题改成:
据我所知左值是可以修改的。
答案对你来说应该是显而易见的。当函数的参数类型是非常数引用时,只有左值s可以传递给此类函数,而不是右值s。
编辑2
感谢@0x499602D2:的评论
对于用户定义的类,您可以在右值上使用赋值运算符,因为它们类似于成员函数调用:
A{} = A{};
将在给定可访问的复制/移动赋值运算符的情况下编译。我认为术语左值指定了一个将存在于所用表达式之外的对象,而右值
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 强制转换为引用类型
- 引用一个已擦除类型(void*)的指针
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 列出生成器(lambda的向量)会导致通过引用捕获的非常奇怪的行为
- 从对象调用成员对象,错误:引用非常量值的初始值必须是左值
- 一个非常弱的引用(无法转换为共享)
- 阻止const类函数在引用成员上调用非常常量类函数