【发布时间】:2020-01-23 12:04:27
【问题描述】:
在 C++ 中,可以将右值传递给接受 const 左值引用的函数。我不明白为什么会这样。
表达式Function(Entity()) 表面上是一个右值,它在内存中没有可识别的位置。如果Function() 采用Entity& 而不是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
}
【问题讨论】:
-
这与the lifetime of temporaries 的关系比右值和左值更多。
-
查看here
-
所有临时对象在内存中都有一个位置,但 C++ 并不总是公开那个位置 :)
-
另请注意,从技术上讲,没有什么可以阻止编译器将临时对象绑定到非常量左值引用,正如 Visual C++ 扩展所显示的那样。使生命周期(和其他)问题更容易处理确实是 C++ 规范中的一个限制。
标签: c++ reference value-categories