式テンプレートの側面を理解しようとしています。
この手法を行列に適用しているとしましょう。
a,b,c
タイプ の具体的な行列が 3 つあるとしMatrix<double, ConcreteMatrix<double>>
ます。ここでのクラスMatrix<double, T>
は、 type のメンバーを含む単なるシェルですT
。はConcreteMatrix<double>
実際のマトリックス クラスです。
operator+()
2 つのオブジェクトに適用された式テンプレートa + b
では、タイプ のオブジェクトを返します。コードを短くして読みやすくするためにMatrix<double, Sum<type(a),type(b)>>
、私が書いた場所はと ではtype(a)
ありません。type(b)
内部では、クラスはオブジェクトおよびSum<T,S>
への 2 つの **定数参照** を格納します。a
b
を計算するときに私の疑問が生じ(a + b) + c
ます。まあ、より正確に計算するためにMatrix<double, ConcreteMatrix<double>> d = (a + b) + c
。operator=
ここで、実際に計算を行い、結果を埋めるのは、これが処理するものであることを思い出してくださいd
。
本当に内側にあるものをoperator+(a, b)
返しました。私が正しく理解している場合、このオブジェクトは一時的なものです。と呼びましょう。実行する時が来ましたこれはと への定数参照を含む型のオブジェクトを返します。このオブジェクトを と呼びましょう。Matrix
Sum
pab
operator+(pad, c)
Matrix<double,Sum<type(pad),type(c)>>
pab
c
ppabc
の本体の範囲で pab がどのように「生きていた」かを理解していますoperator+(pad,c)
。ppabc
したがって、への参照を含めて作成しても問題ありませんpab
。
質問:でも、外に出るとどうなりoperator+(pad, c)
ますか? pab
外に出たら「死ぬ」べきじゃないのoperator+(pad, c)
?そうではないようです。なんで?(私は Todd Veldhuizen と David Vandevoorde の本に書かれているように実装を実行しましたが、うまく動作します。) つまり、何らかの形で一時的なオブジェクトpab
は本体の外にまだ存在operator+(pad, c)
し、この演算子が返すオブジェクトは参照にアクセスして要求することができますpab
。含まれる値。
式テンプレートの手法を適用して他の関数の遅延評価を取得したいので、この一時的なものが私が想像していた範囲を超えて存在する根本的な理由を正確に理解したいと思いますexp()
。トラブルに遭遇しました(一時的な破壊による実行エラー)。参照の代わりに具象オブジェクトを内部に保存すると、エラーは消えましたMatrix<double, Exponential<type(a)>>
。したがって、上記の質問を理解すると役立ちます。