前回のクイズの解答である.この話は 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 に感謝します.