【问题标题】:Why is it possible to pass an rvalue by const lvalue reference? [duplicate]为什么可以通过 const 左值引用传递右值? [复制]
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 2015-03-24
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    相关资源
    最近更新 更多