右值与否参考

Reference for rvalue or not

我想知道下一个代码能否正确处理 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;
}

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

const auto& v = foo();

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

const auto& v2 = v;

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