C++ riddle 2010-03-19 (solution) | Chandler@Berlin

Chandler@Berlin

ベルリン在住

前回のクイズの解答である.この話は C++ の知識が必要です.

まずは,string の default constructor が何をしているかを見てみよう.すると,empty string を生成しており,1 という文字列は生成していない.コンストラクタは呼ばれているのだろうかと break pointを設定しても,実は呼ばれていないようだ.

middle() のラインを以下のように変更すると,

std::string prefix("->"), middle(""), postfix("<-");

思ったような出力,

Hi:-><-

が得られる.

ヒントは,middle() は以下のようになっていることである.

std::string middle();

ここまできたらわかった人もいるかもしれない.

さて私がどんな C++ の罠にはまったかを見てみよう.

1. これは string の object の定義ではなく,string を返す関数の宣言である.

2. したがって,cout 中の middle は関数への pointer を示す.

3. 関数が宣言されている以上,実装は不明であるが,関数への pointer はNULL ではないはず.(でなければ link で失敗して executable はできない.)

4. 暗黙の変換で,この関数への pointer は boolean になる.通常は pointer ならば hex で出力されるのだが,関数の declaration の場合にはそうではないらしい.

5. (C++ では真の boolean 型はなく,int で代用する.) NULL でない pointer は true になる.

6. (C++ では真の boolean 型はなく,int で代用する.) true は console に出力される場合には 1 となる.

さて,この一行にこれだけの罠がある.C++ の program は難しい.

謝辞

この素敵な C++ riddle を教えてくれた Peter に感謝します.