在学校任务上工作时,我们必须对运算符重载和模板进行操作。很酷。我写道:C++:*(multiply)运算符的关联性不是从左到右
template<class T>
class Multiplication : public Expression<T>
{
private:
typename std::shared_ptr<Expression<T> > l, r;
public:
Multiplication(typename std::shared_ptr<Expression<T> > l, typename std::shared_ptr<Expression<T> > r) : l(l), r(r) {};
virtual ~Multiplication() {};
T evaluate() const
{
std::cout << "*";
T ml = l->evaluate();
T mr = r->evaluate();
return ml * mr;
};
};
然后一个朋友问我为什么他的代码以“错误”的顺序产生输出。 他有这样的事情
T evaluate() const
{
std::cout << "*";
return l->evaluate() * r->evaluate();
};
l->evaluate()
之前的r->evaluate()
打印的调试信息的代码。 我在我的机器上测试了它,只需将这三行改为一行即可。
所以,我认为,那么*
应该是从右到左的联想。但在互联网上的任何地方,他们都说这是从左到右。是否有一些额外的规则?在使用模板时可能有些特别之处或者这是VS2012中的一个错误?
联合性与评估顺序不一样。 –
似乎是这样的关键:)我会做一些研究,谢谢。 –
[运算符优先级与评估顺序](http:// stackoverflow。com/questions/5473107/operator-precedence-vs-order-of-evaluation) –