我有以下定义
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() + ")";
}
};而这个主要功能
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--而不忽略地址清除器?有什么可供选择的?
提前感谢!
发布于 2020-03-06 16:16:36
因此,我的具体问题是:如何将一个临时对象绑定到我的表达式-
-Ref而不失败地址清除器?
不能。临时程序在整个表达式的末尾被销毁,除非您用函数本地引用或函数本地rvalue引用来捕获它们。您的类成员不是对const的函数本地引用或函数本地rvalue引用,因此没有临时的生存期扩展。
https://stackoverflow.com/questions/60567814
复制相似问题