【问题标题】:Is There a Pointer Version of ref that Supports Rvalues?是否有支持右值的 ref 指针版本?
【发布时间】:2015-05-15 22:37:24
【问题描述】:

这真是把ref的两个问题合二为一了:

  1. 我可以在右值上使用ref 吗?显然,作为程序员,我有责任确保它比任何调用代码都更长寿。
  2. 是否有ref 的指针版本?

这两个粗略问题的目标在这个粗略的答案中实现:https://stackoverflow.com/a/29031944/2642059 我宁愿只创建一个指向 vector::data 右值的指针,而不是创建一个 temp 变量。

【问题讨论】:

  • 根据链接的 cpp 标准库规范,您不能在右值上使用 ref。我不明白你想做什么 2)
  • 1.是的,它在 C++11 中称为右值引用;) 2. 不,引用本质上是永远不能为空的指针,并且添加了一些语法糖。它们对于 C++ 语言设计是必需的,例如想象一下。没有它们的复制构造函数或运算符重载。

标签: c++ pointers reference ref rvalue


【解决方案1】:
  1. 不,界面阻止了这一点,正如您链接到的参考所示。有一个使用 lvalue 引用的重载;删除 rvalue 引用的那个。很难想象您如何能够在无法通过 lvalue 访问对象的情况下对对象的生命周期负责。

  2. 那将是一个指针。 reference_wrapper 的目的是允许像值一样传递引用(常规引用不能),同时保留引用的语法(使用指针会丢失)。如果你想通过值传递一个指针,并让它像一个指针一样工作,那么只需使用一个指针。

我宁愿只创建一个指向vector::data 右值的指针,也不愿创建一个临时变量。

那将是一个指向临时的指针。在您可以对其进行任何操作之前,临时对象将被销毁,从而使指针无效。正如您所说,您需要对其生命周期负责,您可以通过创建变量来做到这一点。一旦你有了它,你就有了一个左值

【讨论】:

  • 现在让我澄清一下,我的愤怒的链接答案已被删除:假设我有一个带有此签名的函数:void foo(vector<int>*) 如果我创建一个内联向量,我知道它会直播foo的堆栈寿命。但我想传递一个指向它的指针。有没有办法做到这一点?
  • @JonathanMee:不。您可以更改函数以获取值或常量或 rvalue 引用,或者您可以将指针传递给非临时变量。但是即使在可以避免悬空指针的情况下,该语言也不允许您获取临时地址。
  • 谢谢,这就是我正在寻找的答案。在我接受之前,您是否有机会编辑您的答案以包含该信息?
  • @JonathanMee:对于与问题无关的内容(已经有一个问题太多),评论是一个更好的地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多