c++ - 为什么可以通过 const 左值引用传递右值?
问题描述
在 C++ 中,可以将右值传递给接受 const 左值引用的函数。我不明白为什么会这样。
该表达式Function(Entity())
表面上是一个右值,它在内存中没有可识别的位置。如果Function()
要采用 aEntity&
而不是 a const Entity&
,那么这将行不通。但是,如果函数采用 const 左值引用而不是左值引用,那么这可以正常工作。
有人可以解释一下这是如何工作的以及为什么?
class Entity
{
Entity()
{
std::cout << "Entity created\n";
}
}
void Function(const Entity& e) // recieved as const lvalue reference
{
std::cout "Inside function\n";
}
int main()
{
Function(Entity()); // passing rvalue
}
解决方案
需要注意的是,这不需要类。void Function(int const& i) { std::cout << i; }
可以称为Function(2+2)
。
类和内置类型的原因是一样的。临时可以绑定到 const 引用。这是非常有意的。它安全且有用。安全:由于您不能通过 const 引用更改引用的对象,因此此类更改不会丢失在临时对象中。有用:它使编译器免于复制大对象。
推荐阅读
- python - 导入到另一个 .py 文件
- jenkins - 在 Jenkins Job 中选择版本后动态填充文件夹的路径
- python-3.x - Google Cloud Monitoring Api - 400 无法写入一个或多个 TimeSeries 遇到重复的 TimeSeries
- javascript - npm copyfiles 不工作,给出 ELIFECYCLE 错误
- kotlin - Kotlin 标准函数创建 if null 并返回 all in one
- android - 如何在 Android 中显示自己的地图?
- javascript - 实例化一个日期对象,给定时间作为字符串和时区?
- linux - “NoneType”对象没有属性“secret_key”
- java - 如何在 apache camel rest api 中进行自定义错误处理?
- c - 在 Windows msvc 上编译 .c/.h 文件时,如何通过 C/C++ 智能感知(包括/索引)从 VS 代码中排除 cpp 相关文件