因此,我有以下类(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,就可以了。