如何从另一个右值成员函数调用右值成员函数?

时间:2017-08-29 09:27:46

标签: c++ c++11

我正在尝试创建一个只应该暂时存在的类。我正在使用它来创建一个类似于函数的部分应用程序的接口。这是我正在尝试做的一个愚蠢的例子。

struct Adder {
  explicit Adder(const int &leftOp)
    : leftOp(leftOp) {}

  int add(const int rightOp) const {
    return leftOp + rightOp;
  }

  //note that addTwice calls add
  int addTwice(const int rightOp) const {
    return add(rightOp) + add(rightOp);
  }

private:
  const int &leftOp;
};

struct Calculator {
  explicit Calculator(const int leftOp)
    : leftOp(leftOp) {}      

  Adder add() const {
    return Adder(leftOp);
  }

  void setLeftOp(const int newLeftOp) {
    leftOp = newLeftOp;
  }

private:
  int leftOp;
};

计算器就像这样使用。

Calculator myCalculator(4);
const int myNum = myCalculator.add().add(5);
std::cout << myNum << '\n'; // 9

我想限制Adder的界面,以便只能按上述方式调用它。我希望编译器阻止用户在变量中存储Adder

auto myCalcPtr = std::make_unique<Calculator>(4);
const Adder adder = myCalcPtr->add();
myCalcPtr.reset();
//oh dear. Adder has a dangling reference to a member in Calculator
const int myNum = adder.add(5);

我的想法是将Adder::addAdder::addTwice标记为&&,如此

int add(const int rightOp) && {
  return leftOp + rightOp;
}
int addTwice(const in rightOp) && {
  return add(rightOp) + add(rightOp);
}

但我在Adder::addTwice中遇到了编译器错误。错误是

No matching member function for call to `add`
Candidate function not viable: 'this' argument has type 'const Adder' but method is not marked const

所以我添加了两个函数const &&,如此

int add(const int rightOp) const && {
  return leftOp + rightOp;
}
int addTwice(const in rightOp) const && {
  return add(rightOp) + add(rightOp);
}

但仍然遇到同样的错误然后我来到stackoverflow并询问

如何强制Adder的所有实例始终是一个临时的?

我的实际问题比上面的例子复杂得多。我不是一个问初学者的初学者!

0 个答案:

没有答案