【问题标题】:Reference for rvalue or not是否参考右值
【发布时间】:2018-06-06 15:27:59
【问题描述】:

我想知道下一个代码是否可以正确使用 v 和 v2 变量,或者这些是临时变量的引用?换句话说,我可以通过引用捕获返回的右值吗?我不认为,但我的团队负责人有不同的想法。

#include <iostream>

struct Foo {
  Foo(Foo&&) = delete;
  Foo& operator=(Foo&&) = delete;

  Foo() {
    std::cout << "Constructor" <<std::endl;
  }
  Foo(const Foo&) {
    std::cout << "Copy Constructor" <<std::endl;
  }
  Foo& operator=(const Foo&) {
    std::cout << "Copy  = Constructor" <<std::endl;
    return *this;
  }
  ~Foo() {
    std::cout << "Destructor" <<std::endl;
  }
};

Foo foo() {
  Foo v;
  return v;
}

int main() {
  const auto& v = foo();
  const auto& v2 = v;
  return 0;
}

【问题讨论】:

  • 我的意思是……把它扔进编译器,看看它说了什么?
  • 它工作正常,但对我来说似乎 v 和 v2 变量捕获临时值的引用,这意味着导致 SEGFAULT
  • 将临时对象绑定到 const 引用会将临时对象的生命周期延长到引用的生命周期。

标签: c++ c++11 reference lifetime const-reference


【解决方案1】:

是的,this works fine 及其行为已定义。

const auto& v = foo();

这将临时绑定到引用。临时的生命周期将延长以匹配v 的生命周期。 (在 C++03 中甚至在右值引用成为一件事之前就支持将临时对象绑定到 const 引用。)

const auto& v2 = v;

这只是对同一个对象的另一个引用。它基本上是一个空操作,将在编译过程中被消除。只要v2 的寿命不超过v(在这种情况下不会),那么就没有问题。

【讨论】:

  • 那么,auto v&amp; = (1 - 2) 这样的表达式也会正确,对吧?
  • @voltento,不,它必须是一个常量引用。
  • @voltento 如果你的意思是auto&amp; v = (1 - 2);,那么没有。您不能将临时对象绑定到非常量引用。它必须是常量。所以const auto&amp; v = (1 - 2); 会起作用。
  • 请注意,auto &amp;&amp; v = (1 - 2) 在 C++11 中也可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多