首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将rvalue ref绑定到lvalue ref类成员

将rvalue ref绑定到lvalue ref类成员
EN

Stack Overflow用户
提问于 2020-03-06 16:11:01
回答 1查看 65关注 0票数 0

我有以下定义

代码语言:javascript
复制
class Expression {
public:
  virtual int evaluate() const = 0;
  virtual std::string to_string() const = 0;
};

class Constant : public Expression {
  int value;

public:
  Constant() = delete;
  Constant(int value) : value(value) {}
  Constant(Constant&& c) = default;

  virtual int evaluate() const { return value; }
  virtual std::string to_string() const { return std::to_string(value); }
};

class BinaryOperator : public Expression {
protected:
  const Expression& leftOperand;
  const Expression& rightOperand;

public:
  BinaryOperator() = delete;
  BinaryOperator(const Expression& left, const Expression& right)
    : leftOperand{left}, rightOperand{right} {}
  BinaryOperator(Expression&& left, Expression&& right) // (2)
    : leftOperand(std::move(left)), rightOperand(std::move(right)) {}
  virtual std::string to_string() const = 0;
};

class PlusOperator : public BinaryOperator {
public:
  using BinaryOperator::BinaryOperator;
  virtual int evaluate() const {
    return leftOperand.evaluate() + rightOperand.evaluate();
  }
  virtual std::string to_string() const {
    return "(" + leftOperand.to_string() + "+" + rightOperand.to_string() + ")";
  }
};

而这个主要功能

代码语言:javascript
复制
int main(void) {
  Constant c1{5}, c2{10};
  PlusOperator p1{c1, c2};
  std::cout << p1.to_string() << " = " << p1.evaluate() << std::endl;

  PlusOperator p2{Constant{5}, Constant{10}};
  std::cout << p2.to_string() << " = " << p2.evaluate() << std::endl; // (1)
}

编译过程中没有问题(g++ -std=c++17)。但是,如果我使用-fsanitize=address标志进行编译,程序就会在第(1)点结束。根据gdb,当我想打电话给p2.to_string()时。我假设,我在(2)做了一些错误的事情,并且对象没有被正确地存储/生命周期延长。

因此,我的具体问题是:如何能够将一个临时对象绑定到我的表达式--Ref--而不忽略地址清除器?有什么可供选择的?

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-06 16:16:36

因此,我的具体问题是:如何将一个临时对象绑定到我的表达式-

-Ref而不失败地址清除器?

不能。临时程序在整个表达式的末尾被销毁,除非您用函数本地引用或函数本地rvalue引用来捕获它们。您的类成员不是对const的函数本地引用或函数本地rvalue引用,因此没有临时的生存期扩展。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60567814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档