为什么可以通过const左值引用传递右值?

时间:2019-09-23 12:06:35

标签: c++ reference value-categories

在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
}

1 个答案:

答案 0 :(得分:1)

需要注意的重要一点是,这不需要类。 void Function(int const& i) { std::cout << i; }可以称为Function(2+2)

原因与类和内置类型相同。临时对象可以绑定到const引用。这是非常故意的。它既安全又有用。安全:由于无法通过const引用更改引用的对象,因此此类更改不会丢失在临时对象中。有用:它可以避免编译器复制大对象。