5.17 2000

FlashWindow()関数がWin2Kから変わっています。

10.24 1997

Version 1.1 Beta7の壊れた文字列をタイトルとしてキープしようとするバグに関して。


    CString s;
    LPCTSTR p = s.IsEmpty() ? 0 : s;
という式で、p に値ゼロが入ると思いきや、0 を評価するところでなぜか CString がコンストラクトされて、値は 0 にならない。この場合呼ばれるコンストラクタは、
    CString::CString(TCHAR ch, int nRepeat = 1)
三項演算子を使わなければ、この問題はおきない。
    if (s.IsEmpty())
        p = 0;
    else
        p = s;
どうしてか、誰か教えて下さい。
と書いたところ、Daisuke Araiさんから解説を頂きました。


Date: Mon, 11 Nov 1996 02:18:41 +0900
From: Daisuke Arai <arapyon@raiden.com>

[中略]

? 演算子は、返り値の二つの型は同じである必要がある。この場合の、0 : s について考えると、

    s.IsEmpty() ? LPCSTR(0) : LPCSTR(s)
か、
    s.IsEmpty() ? CString(0) : s
のどちらかになると思いますが、上のケースでは、両方ともキャストが必要ですので、コンパイラがキャストをできない。下のケースでは、キャストするのは、0 だけでよいので、コンパイラが自動的にキャストできる。

という理由で、CString::CString(TCHAR ch, int nRepeat = 1) が呼ばれてしまうのではないでしょうか?

[後略]


ということで納得しました。

  s.IsEmpty() ? LPCSTR(0) : LPCTSTR(s);
あるいは
  s.IsEmpty() ? 0 : LPCTSTR(s);
で、望んだ結果が得られました (値が LPCTSTR(0) になった)。


Last modified: Wed May 17 22:29:25 JST 2000