About

what kind of things interest me?

Looking for something specific?

 

コンパイラさんだって皆のために頑張ってるんです。C の include を引きずってる上に template まで展開させられて、コンパイラさんは本当に本当に頑張っているんです。皆のためなんです。頑張ってる人のこと、思ってみてくださいよ。ようし、俺も皆のために頑張ろう!そんな気持ちになりませんか?ならない人は人間じゃなくて悪魔です。

悪魔っていうのは、悪いことをしてやろう!っていう人のことをいうのではありません。悪魔というのは、その気はなくても人を苦しめる、そういう存在なのです。いいですか、例えばここにメンバ関数の const 修飾がされていない巨大なクラスがあります。

class FxxkObj { public: int get_x(); };

この巨大なクラスのオブジェクトから値を取ってきて、その値に何らかの処理をする関数をあなたは書きたいと思いました。コピーを避けるためにこのオブジェクトを const 参照で受け取りましょう。

void f(const FxxkObj& obj){
//int x = obj.get_x(); // アレ?アレアレアレ?
}

書けません。get_x メンバ関数の const 性が保障されていないからです。 あなたは仕方なくこれをコピーしようとするでしょう。しかし、世の中のクラスにはコピーができないクラスも存在します。FxxkObj がコピーコンストラクタや代入演算子を持たなかったら…?

class UncopyableFxxkObj { public: int get_x(); private: ... /* コピーコンストラクタや代入演算子を private に */ };
void f(const UncopyableFxxkObj& obj){
//UncopyableFxxkObj tmp(obj); // どうしてこうなった…
//int x = obj.get_x(); // もうダメだ!
}

こうなったらもうただの参照もしくはポインタを受け取るしかありません。書き換える必要がないにも関わらず。

確かにクラスの実装者の視点では、そのメンバ関数がオブジェクトの状態を変更しないことは自明かもしれません。利用者にとってすらそうかもしれません。ですがコンパイラさんは、知らないんです。分からないんです。真っ暗な C++ という闇の中を一人さまよって、怯えているんです! すごく、すごくかわいそうですね…

いいですか、これを読んだ皆さんは、決して悪魔にならないでください。聡い読者さんのことですから、悪魔だったいつかの自分が、いずれ今日の自分を苦しめるのだということぐらいは、分かってくださるはずです。

 
2010.10.10  10:59pm  

Post Notes

  1. memeofhash reblogged this from kiyoya
  2. kiyoya posted this
      
RSS
a Tumblr theme by Robert Boylan