Работая над школьным заданием, нам нужно было что-то делать с перегрузкой операторов и шаблонами. Все круто. Я написал:
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();
};
Код r->evaluate()
напечатал отладочную информацию до l->evaluate()
. Я также проверил это на своей машине, просто изменив эти три строки на одну строку.
Итак, я подумал, что тогда *
должен быть ассоциативным справа налево. Но везде в интернете говорят, что слева направо. Есть какие-то дополнительные правила? Может быть, что-то особенное при использовании шаблонов? Или это ошибка в VS2012?