c++ - 右值与否引用

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

我想知道下一段代码是否可以正确处理 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();

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

const auto& v2 = v;

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

关于c++ - 右值与否引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50724163/

相关文章:

c++ - 将 ifstream 的一部分读入字符串对象?

c++ - 获取线段和 2^n 网格之间的所有交点(以整数表示)

c++ - std::promise 通知多个客户端

c++ - 用名称标记 std::function?

java - 来自Java,学习C++——理解函数指针

c++ - 我应该更喜欢成员数据中的指针还是引用?

c++ - 如何使用 Qt 在 D-Bus 上创建/实例化配对代理

c++ - 已知大小时向 vector 添加元素的基准测试

c++ - 成员函数模板,其参数数量取决于一个完整的模板参数

c++ - 为什么下面的程序运行良好?我从函数返回对局部变量的引用