Chandler@Berlin

Chandler@Berlin

ベルリン在住



Amebaでブログを始めよう!
長い間 Ameba を使わせて頂いていましたが,ここではいくつか難しいことがあるため,今後は以下の場所で blog を続けることにしました.それでは.

http://jashitohichumaya.blogspot.de/
C++: Operator= returns const reference of *this or reference of *this?

Abstract

最近,cppcheck を使い始めた.私は operator= の返り値を *this の const reference にしていたのだが,cppcheck はこれを単なる reference にすべきだと指摘する.その理由を考えた.

Contents

cppcheck は C++ コードを静的に解析するツールである.(http://cppcheck.sourceforge.net/) メモリリークなどのエラーまである程度指摘するなどなかなかすごいツールである.このツールは,operator= が const のthis reference を返すと単なる reference を返すべきだと指摘する.以下にそのコードを示す.

---
#include
class OpTest {
public:
/// constructor
OpTest(int init_int) : m_int(init_int){
// empty
}
/// operator= with const reference
OpTest const & operator=(OpTest const & rhs){
if(this != &rhs){
m_int = rhs.m_int;
}
return *this;
}
public:
int m_int;
};
---

これを cppcheck に通すと,

---
[operator_substitute_00.cpp:9]: (style) 'OpTest::operator=' should return 'OpTest &'
---
と指摘される.

私は,インスタンスへの代入が終わったあとは, (*this) は const であるのが普通だと思っていたので,この指摘にはちょっと驚いた.それで Web を調べてみたのだが,この理由を説明している page はみつからなかった.ただ,多くのコードは const reference を返すよりも単なる reference を返している.

同僚の何人かに尋ねてみると,理由はあまり知られていないようだ.ただ,Aliが,代入の後に non const の method を実行できるからではないかと教えてくれた.つまり,

---
OpTest a(0);
OpTest b(1);
(a = b).non_const_method();
---

というような場合である.確かにそうかもしれない.ただ,私は個人的には

---
OpTest a(0);
OpTest b(1);
a = b;
a.non_const_method();
---
と書くだろうと思う.
結論

私は normal の変換は逆行列の転置であるというのは厳密には正しくないと思う.normal vector は column vector ではないので,式 5 のように左逆行列がかかっているだけである.計算機上の実装では normal vector をcolumn vector として扱うので,それを転置しているにすぎない.本来は左逆行列で書くべきであろう.だから文献 [2,3,6]らは間違いとは言えないが,しかし,私としてはこれらを区別する文献[4,5]の説明が好みである.

文献[2,3,6]がわかりにくいというのではない.特になぜ normal の変換が上手くいかないかは[2,3,6]の説明の方が直感的で好きである.しかし,normal と通常のベクトルの本質的な違いというのは covariant かcontravariant か,あるいは column vector か row vector かということに注意をしても良いと思う.ところで,変化しないベクトルと言っても座標の表現は変化することは注意すること.contravariant vector と covariant vector は内積を考えた説明の方がいいかもしれない.これはもう少し私も理解が必要だと思う.

座標変換によって変化しないものは何かということはなかなか興味あるテーマである.例えば変換してもユークリッド距離は変化しないことから内積などの話がでてくる.物理量の変化しないもの,例えば Maxwell 方程式における磁場はどう変換しても湧き出しがない(磁場にはモノポールがない)ことからアインシュタインは特殊相対性理論を確信したという話などがある.このあたりはもっと調べていつか書けたら嬉しいと思う.


[1] Yoshihiko Futamura, http://en.wikipedia.org/wiki/Partial_evaluation

[2] Matt Pharr, Greg Humphreys, ``Physically Based Rendering, Second Edition: From Theory To Implementation'', Morgan Kaufmann, 2010

[3] Philip Schneider, David H. Eberly, ``Geometric Tools for Computer Graphics'', Morgan Kaufmann, 2002

[4] Gilbert Strang, ``Introduction to Linear Algebra, 4th Edition'', Wellesley-Cambridge Press, 2009

[5] Koukichi Sugihara, ``Guraphics no suuri (Mathematical theory of graphics)'', Kyouritu shuppan, 1995 (杉原厚吉, グラフィックスの数理, 共立出版, 1995)

[6] Tomas Akenine-Moller, Eric Haines, Naty Hoffman, ``Real-Time Rendering (2nd Edition)'',
A K Peters/CRC Press, 2002