При работе над заданием школы нам нужно было что-то сделать с перегрузкой оператора и шаблонами. Все круто. Я написал:C++: ассоциативность оператора * (умножить) не слева направо
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?
Ассоциативность не совпадает с порядком оценки. –
Кажется, что это ключ :) Я сделаю некоторые исследования, спасибо уже. –
Возможный дубликат [Приоритет оператора по отношению к порядку оценки] (http: // stackoverflow.com/questions/5473107/operator-priorence-vs-order-of-evaluation) –