1

我想知道下一个代码是否可以使用 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;
}
4

1 回答 1

3

是的,这可以正常工作,并且它的行为已定义。

const auto& v = foo();

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

const auto& v2 = v;

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

于 2018-06-06T15:31:51.423 回答