因此,我有以下类(class):

typedef double decimal;

class Ratio {
  int num, den;
  decimal val;

public:
  Ratio() { num = 1, den = 1, val = (decimal)num / den; }

  Ratio update(int a, int b) {
    num *= a, den *= b;
    val = (decimal)num / den;
    return *this;
  }

  decimal v(void) { return val; }

  friend ostream &operator<<(ostream &out, const Ratio &R) {
    return (out << R.num << ':' << R.den);
  }
};


当我在输出流中使用成员函数时:
cout<<"R = "<<R.update(2,1)<<"\tvalue = "<<R.v();

其中R是Ratio类型,首先调用最右端的函数,以便它显示更新的Ratio但未更新的值:
R = 2:1    value = 1

我通过将流分成两部分来克服了这个问题:
cout<<"R = "<<R.update(2,1), cout<<"\tvalue = "<<R.v();

这样我就“强制”首先调用.update()。是否仅使用一个流进行输出就可以实现这一目标?

最佳答案

由于c++中没有保证的评估顺序,因此如您在修复程序中所做的那样,不将其拆分为单独的部分将无法正常工作。

cppreference报价



正如@super用户指出的那样,从c++ 17开始,现在定义了移位运算符的求值顺序。它隐藏在我上面链接的页面上的规则的项目符号19)中。因此,如果可以使用c++ 17,就可以了。

09-06 20:39