LPCTSTR と const LPTSTR

LPCTSTR と const LPTSTR は意味が違うということに初めて気が付きました。

void foo(const LPTSTR str)
{
    str[0] = '\0';
}

これ、const だからコンパイルでエラーになるに決まってると思ってたら、無事通りました。
でも、

void foo(LPCTSTR str)
{
    str[0] = '\0';
}

これはエラーが出ます。


定義を見てみると、

typedef TCHAR* LPTSTR;
typedef const TCHAR* LPCTSTR;

こんな感じになってます。
つまり、LPCTSTR は const TCHAR* で、const LPTSTR は TCHAR* const という意味になってるみたいですね。


関連:id:melpon:20060119