2

学校の課題に取り組んでいる間、演算子のオーバーロードとテンプレートで何かをしなければなりませんでした。すべてクール。私が書いた:

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()ました。これらの 3 行をワンライナーに変更するだけで、自分のマシンでもテストしました。

*それで、それなら右から左への結合であるべきだと思いました。しかし、インターネット上のどこでも、彼らはそれが左から右であると言います. 追加のルールはありますか?テンプレートを使用する際に何か特別なことがありますか? または、これは VS2012 のバグですか?

4

2 に答える 2